![]() |
![]() |
klem4 |
![]()
Сообщение
#1
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
собственно имеем
Цитата В текущем директории имеется 5 непустых файлов (хотя бы два из них не пустые): tfort, t18, tout, t.325, ftmin. Что произойдет при посылке команды: cat t* > tout ответ Спойлер (Показать/Скрыть)
мое объяснение Спойлер (Показать/Скрыть)
Олег, сеня у препода спрашивали, он сказал что все верно с ответом((... -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
![]() ![]() |
compiler |
![]()
Сообщение
#2
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
я вижу обьяснение немного по другому...
1) по текущей директории происходит поиск файлов (с маской) 2) cat изымает их содержимое 3) потоком отправляет их в tout (файл не обнуляется, направляя в него поток мы дописываем) 3б) содержимое tout отправляется в tout(!) Тут может происходить следующее: а) ошибка cat: tout: ввод и вывод в один файл, как произошло у меня (интепритатор bash; OS:Xubunta). б) копирование, до тех пор, пока не забьется диск, как произошло у тебя...(какой у тебя интепритатор?) попробуй выполнить cat t* > ftmin (или в другой файл !(*t) )) и увидишь, что никакой рекурсии поиск не вызывает. ЗЫ вызавать файлы лучше (хороший тон) с указанием месторасположения, например cat t* > ./tout, особенно запускаемые файлы(например ./prog, а не prog[/b]), и особенно под рутом... Сообщение отредактировано: compiler - 22.12.2007 14:01 -------------------- Спасибо!
Удачи! |
klem4 |
![]()
Сообщение
#3
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Цитата какой у тебя интепритатор? дома никсов нет, по этому я даже проверить не могу... Сообщение отредактировано: klem4 - 23.12.2007 11:07 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
compiler |
![]()
Сообщение
#4
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
дома никсов нет, по этому я даже проверить не могу... вобщем, когда узнаешь правильный ответ, скажешь, интересно же... Договорились?-------------------- Спасибо!
Удачи! |
Lapp |
![]()
Сообщение
#5
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
(файл не обнуляется, направляя в него поток мы дописываем) Обнуляется. Дописывался бы он если бы вместо > стояло бы >>. Смысл в том, что сначала в tout записывается содержимое тех файлов, которые в списке раньше. Значит, когда дойдет очередь до чтения tout, он уже будет не пуст и открыт на запись. Его собственное содержимое будет дописываться в конец. При этом процесс чтения будет читать, пока запись в него не кончится. Процесс записи же будет писать, пока чтение не остановится. И все это не остановится никогда. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Altair |
![]()
Сообщение
#6
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Уже решили что изначально что говорилось чушь.
Мой друг админ на FREEBSD даже проверил это: Цитата Altair, 20.12.2007 23:34:26: Вопролс на засыпку В текущем директории имеется 5 непустых файлов (хотя бы два из них не пустые): tfort, t18, tout, t.325, ftmin. Что произойдет при посылке команды: cat t* > tout Semiconductor, 23:59:53: В tout запишется содержимое t18, t.325,tfort. Если до этого в tout что-то было, то оно затрется ![]() Semiconductor, 21.12.2007 0:00:01: Спок ночи ![]() Altair, 0:02:39: Спасибо! Споки! -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
klem4 |
![]()
Сообщение
#7
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Олег, lapp прав ... твой знакомый видать что-то не то сделал, все происходит именно так как написал lapp, зацикливание, вчера проверили.
compiler, правильный ответ скрыт в спойлере в моем первом посте ![]() Сообщение отредактировано: klem4 - 23.12.2007 20:31 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Altair |
![]()
Сообщение
#8
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Сомневаюсь что он что-то сделал не так. Может разны версии по разному обрабатывают
-------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
xds |
![]()
Сообщение
#9
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
OpenBSD ведет себя аналогично FreeBSD. Предполагаю, что поведение может отличаться для файлов различного размера (из-за буферизации). Для файлов размером 1 байт получается именно так, как сказал Олег.
-------------------- The idiots are winning.
|
Lapp |
![]()
Сообщение
#10
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Вопрос, как я понимаю, относился к оригинальной и чистой идеологии Unix. То, что получается в конкретных примерах сейчас - это не совсем то (кстати, я проверил на Linux RedHat 4 и Solaris 10). В них просто вставлена защита.
Но спрашивается: а зачем в cat вставлено специальное распознование (!) ситуации идентичности файлов ввода и вывода? Ответ, я думаю, такой: потому что это может привести именно к тому эффекту, который описан в ответе.. Этот пример просто демонстрирует возможность одновременного открытия файла на запись и чтение разными процессами (если только он не был кем-то заблокирован для исключительного использования). Например, вы качаете на диск видео. Вы можете не дожидаться конца перекачки, запустить вьюер и начать смотреть это видео. Дальше - кто мешает это изображение засовывать обратно в файл, приписывать сзади? Вот и получается то самое зацикливание. Я не говорю, что это исключительное свойство юникса, но понятие файлов и потоков было развито до совершенства именно в нем. MS DOS был простенькой системкой, когда появился (в то время Unix уже полностью оформился), и он был сделан юниксоподобным. Заслуга MS состоит именно в том, что они урезали систему настолько, чтоб она могла без проблем идти на первых персоналках. Потом, когда мощности выросли - Dos (в виде Windows) стали подтягивать к тому, от чего сначала уходили. Так что ничего такого исключительного в этом нету. И более того, реальный Unix уже не Unix.. ![]() И еще: xds совершенно справедливо упомянул буферизацию, ее тут нужно учитывать. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
![]() ![]() |
![]() |
Текстовая версия | 12.07.2025 23:32 |