我有一個使用打開和打印調用將日誌寫入文件的Perl應用程序。perl中的無緩衝IO
open (FH, "d:\\temp.txt");
print FH "Some log";
close (FH);
但是,在機器突然關機期間,日誌不會保留到文件中。因此,在幾個地方進行搜索後,與會者提出了做無緩衝IO(即寫作文到磁盤,而不是將其保持在緩存中,然後刷新它)兩個選項:
我已經嘗試了這兩個選項,它只是不起作用。我在異常關機之前幾秒做的任何寫入都會丟失。
有沒有什麼辦法可以差不多確定性地在Perl中完成無緩衝的IO?我使用Perl 5.8.3運行Windows 7 64位。
編輯:我搜索瞭如何讓Windows執行無緩衝IO,這是如何做到的! 呼叫
- CreateFile與FILE_FLAG_NO_BUFFERING dwFlagAndAttributes可以。然而,這有memory alignment issues要考慮(即文件訪問緩衝區應扇區對齊;應用程序通過調用GetDiskFreeSpace確定扇區大小)
- 使用WriteFile將數據寫入文件。這個寫入將被緩衝,而不是去緩存,它直接進入磁盤。
- 最後,請致電FlushFileBuffers刷新與文件關聯的元數據。
有人能請這些3個調用來幫助Perl的Win32 APIs。
嘗試在您的打印中添加一個'\ n'並使用'$ | = 1'。 –
'$ |'僅在當前選定的文件句柄上設置自動刷新(默認情況下爲標準輸出),並非所有文件句柄 – Cameron
'\ n'永遠不會幫助未附加到終端的句柄。對於具有自動刷新('$ | = 1')的句柄,'\ n'不需要。 – ikegami