open および print 呼び出しを使用してログをファイルに書き込む Perl アプリケーションがあります。
open (FH, "d:\\temp.txt");
print FH "Some log";
close (FH);
ただし、マシンの突然のシャットダウン中は、ログはファイルに保持されません。したがって、いくつかの場所を検索した後、バッファリングされていない IO を実行するための 2 つのオプションが提案されました (つまり、テキストをキャッシュに保持してからフラッシュする代わりに、ディスクに書き込みます)。
これらのオプションの両方を試しましたが、うまくいきません。異常なシャットダウンが失われる数秒前に行った書き込みはすべて失われます。
Perl でバッファなし IO をほぼ決定論的に達成できる方法はありますか? Perl 5.8.3 で Windows 7 64 ビットを実行しています。
編集:ウィンドウにバッファリングされていないIOを実行させる方法を検索しましたが、これがその方法です! 電話
- dwFlagsAndAttributes パラメータに FILE_FLAG_NO_BUFFERING を指定してCreateFileを実行します。ただし、これには考慮すべきメモリ アラインメントの問題があります (つまり、ファイル アクセス バッファはセクタ アラインメントする必要があります。アプリケーションはGetDiskFreeSpaceを呼び出してセクタ サイズを決定します) 。
- ファイルにデータを書き込むには、WriteFileを使用します。この書き込みはバッファリングされず、キャッシュに移動する代わりに、すぐにディスクに移動します。
- 最後に、FlushFileBuffersを呼び出して、ファイルに関連付けられたメタデータをフラッシュします。
これらの 3 つの呼び出しについて、Perl の Win32 API について誰か助けてください。