【发布时间】:2011-07-11 16:20:34
【问题描述】:
我有一个 Perl 应用程序,它使用 open 和 print 调用将日志写入文件。
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 用于 dwFlagsAndAttributes 参数。但是,这需要考虑 memory alignment issues(即文件访问缓冲区应该是扇区对齐的;应用程序通过调用 GetDiskFreeSpace 来确定扇区大小)
- 使用WriteFile 将数据写入文件。此写入将是无缓冲的,而不是进入缓存,而是直接进入磁盘。
- 最后,调用FlushFileBuffers 刷新与文件关联的元数据。
有人可以为这 3 个调用提供来自 Perl 的 Win32 API 的帮助吗?
【问题讨论】:
-
尝试在打印中添加
\n并使用$| = 1。 -
$|只对当前选定的文件句柄(默认为 STDOUT)设置自动刷新,而不是所有文件句柄 -
\n对未连接到终端的句柄没有帮助。具有自动刷新 ($|=1) 的句柄不需要\n。 -
我迫不及待地等待有关我最新答案的反馈!
-
@ikegami,抱歉回复晚了!感谢您的解决方案,我已接受!它只是工作!!!
标签: windows perl io unbuffered