У меня есть приложение Perl, которое записывает журналы в файл, используя вызовы открытия и печати.
open (FH, "d:\\temp.txt");
print FH "Some log";
close (FH);
Однако во время внезапного выключения машины журналы не сохраняются в файле.Поэтому после поиска в нескольких местах были предложены два варианта выполнения небуферизованного ввода-вывода (т.е. записи текста на диск вместо сохранения его в кеше и последующей его очистки):
- sysopen , syswrite
- $ |= 1;
Я испробовал оба эти варианта, но они просто не работают.Любая запись, которую я делаю за секунды до того, как ненормальное отключение будет потеряно.
Есть ли способ, которым я могу почти детерминистически выполнить небуферизованный ввод-вывод в Perl?Я использую 64-битную Windows 7 с Perl 5.8.3.
РЕДАКТИРОВАТЬ: Я искал, как заставить Windows выполнять небуферизованный ввод-вывод, и вот как это можно сделать!Вызовите
- CreateFile с FILE_FLAG_NO_BUFFERING для параметра dwFlagsAndAttributes.Однако при этом необходимо учитывать проблем с выравниванием памяти (т.е. буферы доступа к файлам должны быть выровнены по секторам; приложение определяет размер сектора, вызывая GetDiskFreeSpace )
- Use WriteFile для записи данных в файл.Эта запись не будет буферизироваться, и вместо того, чтобы идти в кеш, она сразу переходит на диск.
- Наконец, вызовите FlushFileBuffers , чтобы сбросить метаданные, связанные с файлами.
Может кто-нибудь помочь с Win32 API от Perl для этих 3 вызовов.