LINUX.ORG.RU

write and fsync


0

0

Приветствую всех.

Допусти есть вызов

write(fd, buf, sizeof(buf));

он проходит успешно и возвращает sizeof(buf)

затем идет некий код, который приводит к Segmentation fault.

Есть ли гарантия, что ядро сбросит на диск этот самый buf или же  в таком случае нужно после write вызывать fsync(fd)?

Спасибо.




★★★★

насколько я понимаю, если оно попало в буферный кэш винта, то будет записано несмотря на сегфолт. однако, это лишь мои домыслы =).

ftor
()
Ответ на: комментарий от ftor

Вы какой кэш имеете ввиду?
который в ядре или который на самом винте находится?
если на самом винте, то запишется,
тут вопрос к "ядерному" кэшу.

Dead ★★★★
() автор топика

man 2 write:

NOTES
       A  successful  return  from write does not make any guarantee that data
       has been committed to disk.  In fact, on some buggy implementations, it
       does  not  even guarantee that space has successfully been reserved for
       the data.  The only way to be sure is to call fsync(2)  after  you  are
       done writing all your data.

generatorglukoff ★★
()
Ответ на: комментарий от generatorglukoff

Интерестно, кто автор этого замечания. До 2001 года жили замечательно, а потом в man-page решили добавит пожелание использовать fsync по любому поводу.

А в BSD, вроде бы, такого замечания нет...

>Есть ли гарантия, что ядро сбросит на диск этот самый buf

Разумется нет, если пропадёт питание и т.д. В Linux при записи на ФС, расположенную на локальном диске, на время write() процесс находится в uninterruptable состоянии и его нельзя "убить", а после write() данные находятся в дисковом кеше, и ядро при всем желании не может связать их с процессом, производившим write(), то есть не может очистить их по "Segmentation fault".

mky ★★★★★
()
Ответ на: комментарий от mky

>Интерестно, кто автор этого замечания. До 2001 года жили замечательно, а потом в man-page решили добавит пожелание использовать fsync по любому поводу.

>А в BSD, вроде бы, такого замечания нет...

Вероятно все зависит от реализации в ядре.

>Разумется нет, если пропадёт питание и т.д. В Linux при записи на ФС, расположенную на локальном диске, на время write() процесс находится в uninterruptable состоянии и его нельзя "убить", а после write() данные находятся в дисковом кеше, и ядро при всем желании не может связать их с процессом, производившим write(), то есть не может очистить их по "Segmentation fault".

Я не рассматривал случай, если пропадет питание. Вопрос был только про Segmentation fault.

По поводу дискового кэша были такие же предполажения. Гланое чтобы write их туда действительно помещал. А то мало ли какая там кухня. Может быть есть еще какие-то промежуточные операции, где есть конкретная привязка к pid'у процесса.

Спасибо за ответ.

Dead ★★★★
() автор топика

Имхо, если write выполнен успешно, то данные уже у ядра и то, что происходит с процессом ни на что уже не влияет.

AMDmi3
()
Ответ на: комментарий от AMDmi3

Именно так вжизни и происходит: сегфолт после write() не влияет на результат работы write().

fsync() немного с другой оперы. Эт когда надо защитится от вырубания питания.

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.