IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Простой вопрос по unix
сообщение
Сообщение #1


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


собственно имеем

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

cat t* > tout


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


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

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


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




--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


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

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

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

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
какой у тебя интепритатор?


дома никсов нет, по этому я даже проверить не могу...

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


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


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(compiler @ 21.12.2007 23:21) *

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

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

Смысл в том, что сначала в tout записывается содержимое тех файлов, которые в списке раньше. Значит, когда дойдет очередь до чтения tout, он уже будет не пуст и открыт на запись. Его собственное содержимое будет дописываться в конец. При этом процесс чтения будет читать, пока запись в него не кончится. Процесс записи же будет писать, пока чтение не остановится. И все это не остановится никогда.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Уже решили что изначально что говорилось чушь.
Мой друг админ на 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:
Спасибо! Споки!


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Олег, lapp прав ... твой знакомый видать что-то не то сделал, все происходит именно так как написал lapp, зацикливание, вчера проверили.

compiler, правильный ответ скрыт в спойлере в моем первом посте smile.gif

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Сомневаюсь что он что-то сделал не так. Может разны версии по разному обрабатывают


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


OpenBSD ведет себя аналогично FreeBSD. Предполагаю, что поведение может отличаться для файлов различного размера (из-за буферизации). Для файлов размером 1 байт получается именно так, как сказал Олег.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 21:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name