echo -n > file, cat /dev/null > file

sergey_m

Почему сабж не обнуляет файл если он открыт какой-то программой? Речь идет конечно о Линуксе.

Marinavo_0507

как воспроизвести?

sergey_m

Red Hat Linux release 6.2 (Zoot)
Linux qqq 2.2.24-6.2.3 Fri Mar 14 08:57:46 EST 2003 i686 unknown
Вот что делает эта несчастная программа с файлом:
open O_RDWR);
lseek 0L, SEEK_END);
потом туда пишется только writeом
Пока она работает, я хочу файл обнулить. Команды из сабжа не работают.

Marinavo_0507

Эта программа llseek только один раз делает, в начале? А что ты тогда хотел?
Правильно использовать O_APPEND .

sergey_m

Эта программа llseek только один раз делает, в начале? А что ты тогда хотел?
По херу что она вызывает. "echo -n > file" всегда должно обнулять файл независимо от того, что с ним делает какая-то другая программа.

Marinavo_0507

оно и обнуляет
а программа следующим write опять туда записывает
а как, по-твоему, должно быть?

sergey_m

Я не верю, что она записывает точно такой же объем как и раньше да еще и более 300 Мб за то мгновение, что я набираю "ls -l".

Marinavo_0507

а с чего ты взял, что объём такой же?
P.S. может ты не знаешь про дыры? ну тогда lol

sergey_m

С того, что я делаю 'ls -l', вижу цифру. Делаю 'echo -n>file'. Делаю 'ls -l', вижу цифру. Они одинаковые.
По-твоему, файл с дырой не должен обнуляться по 'echo -n >file'? тогда lol.

Marinavo_0507

при обнулении не меняется позиция в файле у программы, которая туда пишет,
и следующий write создаёт дыру, с начала файла, и до этой позиции

sergey_m

О! Спасибо за объяснение. Но вообще эта фича граничит с багом. Причем во всех ufs...

Marinavo_0507

А какое поведение было бы не багом?
Сбивать позицию для всех программ, которые открыли файл? Ничуть не лучше.
Для того, что ты хочешь, придуман O_APPEND.

sergey_m

Сбивать позицию для всех программ, которые открыли файл? Ничуть не лучше.
Может и лучше. Так получается неявное создание файла с дырой.
Я знаю про O_APPEND, но эта мегапрограмма не моя, к счастью.
Оставить комментарий
Имя или ник:
Комментарий: