Помощь - Поиск - Пользователи - Календарь
Полная версия: Простой вопрос по unix
Форум «Всё о Паскале» > Системы, Сети, Технологии > ОС и ПО
klem4
собственно имеем

Цитата
В текущем директории имеется 5 непустых файлов (хотя бы два из них не пустые):
tfort, t18, tout, t.325, ftmin. Что произойдет при посылке команды:

cat t* > tout


ответ
Спойлер (Показать/Скрыть)


мое объяснение

Спойлер (Показать/Скрыть)


Олег, сеня у препода спрашивали, он сказал что все верно с ответом((...


compiler
я вижу обьяснение немного по другому...
1) по текущей директории происходит поиск файлов (с маской)
2) cat изымает их содержимое
3) потоком отправляет их в tout (файл не обнуляется, направляя в него поток мы дописываем)
3б) содержимое tout отправляется в tout(!)
Тут может происходить следующее:
а) ошибка cat: tout: ввод и вывод в один файл, как произошло у меня (интепритатор bash; OS:Xubunta).
б) копирование, до тех пор, пока не забьется диск, как произошло у тебя...(какой у тебя интепритатор?)

попробуй выполнить cat t* > ftmin (или в другой файл !(*t) )) и увидишь, что никакой рекурсии поиск не вызывает.

ЗЫ вызавать файлы лучше (хороший тон) с указанием месторасположения, например cat t* > ./tout, особенно запускаемые файлы(например ./prog, а не prog[/b]), и особенно под рутом...
klem4
Цитата
какой у тебя интепритатор?


дома никсов нет, по этому я даже проверить не могу...
compiler
Цитата(klem4 @ 23.12.2007 10:06) *
дома никсов нет, по этому я даже проверить не могу...
вобщем, когда узнаешь правильный ответ, скажешь, интересно же... Договорились?
Lapp
Цитата(compiler @ 21.12.2007 23:21) *

(файл не обнуляется, направляя в него поток мы дописываем)

Обнуляется. Дописывался бы он если бы вместо > стояло бы >>.

Смысл в том, что сначала в tout записывается содержимое тех файлов, которые в списке раньше. Значит, когда дойдет очередь до чтения tout, он уже будет не пуст и открыт на запись. Его собственное содержимое будет дописываться в конец. При этом процесс чтения будет читать, пока запись в него не кончится. Процесс записи же будет писать, пока чтение не остановится. И все это не остановится никогда.
Altair
Уже решили что изначально что говорилось чушь.
Мой друг админ на 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 что-то было, то оно затрется smile.gif Только что проверил

Semiconductor, 21.12.2007 0:00:01:
Спок ночи smile.gif

Altair, 0:02:39:
Спасибо! Споки!
klem4
Олег, lapp прав ... твой знакомый видать что-то не то сделал, все происходит именно так как написал lapp, зацикливание, вчера проверили.

compiler, правильный ответ скрыт в спойлере в моем первом посте smile.gif
Altair
Сомневаюсь что он что-то сделал не так. Может разны версии по разному обрабатывают
xds
OpenBSD ведет себя аналогично FreeBSD. Предполагаю, что поведение может отличаться для файлов различного размера (из-за буферизации). Для файлов размером 1 байт получается именно так, как сказал Олег.
Lapp
Вопрос, как я понимаю, относился к оригинальной и чистой идеологии Unix. То, что получается в конкретных примерах сейчас - это не совсем то (кстати, я проверил на Linux RedHat 4 и Solaris 10). В них просто вставлена защита.
Но спрашивается: а зачем в cat вставлено специальное распознование (!) ситуации идентичности файлов ввода и вывода? Ответ, я думаю, такой: потому что это может привести именно к тому эффекту, который описан в ответе.. Этот пример просто демонстрирует возможность одновременного открытия файла на запись и чтение разными процессами (если только он не был кем-то заблокирован для исключительного использования). Например, вы качаете на диск видео. Вы можете не дожидаться конца перекачки, запустить вьюер и начать смотреть это видео. Дальше - кто мешает это изображение засовывать обратно в файл, приписывать сзади? Вот и получается то самое зацикливание. Я не говорю, что это исключительное свойство юникса, но понятие файлов и потоков было развито до совершенства именно в нем. MS DOS был простенькой системкой, когда появился (в то время Unix уже полностью оформился), и он был сделан юниксоподобным. Заслуга MS состоит именно в том, что они урезали систему настолько, чтоб она могла без проблем идти на первых персоналках. Потом, когда мощности выросли - Dos (в виде Windows) стали подтягивать к тому, от чего сначала уходили. Так что ничего такого исключительного в этом нету. И более того, реальный Unix уже не Unix.. smile.gif))

И еще: xds совершенно справедливо упомянул буферизацию, ее тут нужно учитывать.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.