TL / DR: используйте IO::Handle
и метод flush
, например:
use IO::Handle;
$myfile->flush();
Во-первых, вам нужно решить, насколько «промытым» он вам нужен.Может быть довольно много уровней буферизации:
Внутренний буфер Perl на дескрипторе файла.Другие программы не могут видеть данные, пока он не покинет этот буфер.
Буферизация на уровне файловой системы «грязных» блоков файлов.Другие программы все еще могут видеть эти изменения, они кажутся «записанными», но они будут потеряны, если ОС или компьютер выйдет из строя.
Буферизация записей с обратной записью на уровне диска.ОС считает, что они записаны на диск, но на самом деле диск просто хранит их в энергозависимой памяти на диске.В случае сбоя ОС данные не будут потеряны, но при сбое питания это может произойти, если только диск не сможет записать их первым.Это большая проблема с дешевыми потребительскими твердотельными накопителями.
Это становится еще сложнее, когда задействованы SAN, удаленные файловые системы, RAID-контроллеры и т. Д.Если вы пишете по каналам, есть еще и буфер канала.
Если вы просто хотите очистить буфер Perl, вы можете close
файл, print
строка, содержащая "\n"
(так какпохоже, что Perl сбрасывает символы новой строки) или использует IO::Handle
flush
метод .
Вы также можете, за perl faq использовать binmode
или поиграйте с $|
, чтобы сделать дескриптор файла небуферизованным.Это не то же самое, что , как очистка буферизованного дескриптора, поскольку постановка в очередь группы буферизованных записей и выполнение одного сброса имеет гораздо меньшую производительность, чем запись в небуферизованный дескриптор.Если вы хотите очистить буфер обратной записи файловой системы, вам нужно использовать системный вызов, такой как fsync()
, открыть файл в режиме O_DATASYNC
или использовать одну из многочисленных других опций.Это мучительно сложно, о чем свидетельствует тот факт, что PostgreSQL имеет свой собственный инструмент для тестирования методов синхронизации файлов .
Если вы хотите убедиться, что он действительно, действительно, честен на жестком дискев постоянном хранилище вы должны сбросить его в файловую систему вашей программы.Вам также необходимо настроить жесткий диск / SSD / RAID-контроллер / SAN / что угодно, чтобы он действительно сбрасывался, когда операционная система запрашивает его.Это может быть удивительно сложно сделать, и это зависит от конкретной ОС / оборудования.Настоятельно рекомендуется провести пробное тестирование, чтобы убедиться, что вы правильно поняли.