私は、オープンコールとプリントコールを使ってファイルにログを書き込むPerlアプリケーションを持っています。perlでのバッファリングされていないIO
open (FH, "d:\\temp.txt");
print FH "Some log";
close (FH);
ただし、マシンを突然シャットダウンしている間は、ログはファイルに保存されません。だから、いくつかの場所で検索した後、二つのオプションは、(すなわち、ディスクへのテキストを書く代わりに、キャッシュにそれを維持し、それをフラッシュ)バッファなしIOを行うために提案された:
私はこれらのオプションの両方を試しましたが、うまくいきません。異常なシャットダウンが失われる前に私が何度も行うすべての書き込み。
可能なことはありますかほとんどは、PerlでバッファリングされていないIOを確定的に達成していますか?私はPerl 5.8.3でWindows 7 64ビットを実行しています。
EDIT:WindowsでバッファリングされていないIOを実行する方法を検索しました。 コールは、dwFlagsAndAttributesパラメータのFILE_FLAG_NO_BUFFERINGと
- CreateFile。ただし、これにはmemory alignment issuesが考慮されます(つまり、ファイルアクセスバッファはセクタアライメントされている必要があります。アプリケーションはGetDiskFreeSpaceを呼び出してセクタサイズを決定します)
- WriteFileを使用してファイルにデータを書き込みます。この書き込みはバッファリングされず、キャッシュに行くのではなく、すぐにディスクに書き込まれます。
- 最後に、FlushFileBuffersを呼び出して、ファイルに関連付けられたメタデータをフラッシュします。
誰かがこの3回の呼び出しでPerlのWin32 APIを手伝ってもらえますか?
プリントに「\ n」を追加し、 '$ | = 1 'となる。 –
'$ |'は、現在選択されているファイルハンドル(デフォルトではSTDOUT)にautoflushを設定するだけで、すべてのファイルハンドルが – Cameron
'\ n'で端末に接続されていないハンドルには役に立ちません。 autoflush( '$ | = 1')を持つハンドルには' \ n'は必要ありません。 – ikegami