2014-01-28 1 views
3

Мне просто интересно, почему в Perl нет функции «флеша». «Perldoc -f закрыть» говоритДелает ли закрытие файла подразумеваемым flushing в Perl под Unix/MS-Windows/MacOs?

близко Закрывает файл или трубу, связанный с дескриптором, флеши буферы ввода-вывода, и закрывает дескриптор системного файла.

Но страница руководство Unix «человек 2 близко» говорит:

Удачные близко не гарантирует, что данные были успешно сохранены на диск, так как ядро ​​отсрочивает пишет. Для не существует файловой системы для сброса буферов при закрытии потока. Если вы должны быть уверены, что данные физически сохранены, используйте fsync (2). (Это будет зависеть от диска аппаратного обеспечения в этой точке.)

Теперь, насколько я понимаю, нет функции FSYNC в Perl. Конечно, закрытие Perl могло бы вызвать fsync(). Но даже тогда «человек 2 близко» говорит, что это зависит от аппаратного обеспечения, и я не знаю, что происходит на других ОС. Поэтому мой вопрос. Я хочу быть уверенным, что буферы очищены.

ответ

3

в Perl close, как Кассиопеяне fclose, будет вымывать буфера языка IO библиотеки в ОС. На этом этапе приложение можно безопасно прекратить.

Однако это не означает, что файл был записан на диск. В этот момент машину нельзя безопасно отключить. [1] Как и прохождение, которое вы утверждаете, fsync приблизит вас к этому. Помните, что вам нужно не только синхронизировать файл, но и каждый каталог на своем пути.

fsync имеется в качестве IO::Handle::sync. Обработчики файлов наследуются от IO :: Handle, поэтому вы можете просто использовать $fh->sync. (Это требует use IO::Handle; на старых версиях Perl.)


  1. Отсоединение диск не будет в безопасности либо, хотя выталкивания СМИ будет безопасным. ОС завершит свои записи, прежде чем разрешить выброс.
+0

Спасибо.Итак, мораль этой истории заключается в том, что, будучи программистом, вы никогда не сможете полностью убедиться, что ваши данные безопасны на диске, если вы не отключите устройство? Что делать, если вы программист базы данных и должен быть на 100% уверен, что что-то вечно на диске? Заказ клиента, например? – ubuplex

+0

@ubuplex Единственный способ гарантировать, что с полной уверенностью будет включать полный аудит всего стека ввода-вывода из оборудования физического накопителя вверх; на каждом слое есть механизмы кэширования. См. Http://www.postgresql.org/docs/current/static/wal-reliability.html для более подробного обсуждения темы. –

2
  1. close функция в Perl не то же самое, как close функция в C. Perl делает определенные гарантии, что его аналог C не может сделать (хотя в этом вопросе, это не делает).

  2. Эта цитата о поведении C's close говорит о диске (или вообще: физическом носителе длительного хранения). Несмотря на то, что данные логически сохранены в файловой системе с точки зрения программистов, данные могут быть физически быть в буфере операционных систем (то есть в ОЗУ). Это не имеет значения, если вы не пытаетесь удалить физический носитель непосредственно после записи.