我有一个Perl应用程序,使用open和print调用将日志写入文件。
然而,在机器突然关闭时,日志不会被持久化到文件中。经过多处搜索后,有两个选项建议进行非缓冲IO(即将文本写入磁盘而不是将其保留在缓存中再刷新): 我已尝试了这两个选项,但都不起作用。任何在异常关闭前几秒钟进行的写操作都会丢失。
有没有办法在Perl中实现几乎确定性的非缓冲IO?我正在运行Windows 7 64位,并且使用Perl 5.8.3。
编辑:我搜索了如何使Windows执行非缓冲IO,以下是如何完成的!调用
open (FH, "d:\\temp.txt");
print FH "Some log";
close (FH);
然而,在机器突然关闭时,日志不会被持久化到文件中。经过多处搜索后,有两个选项建议进行非缓冲IO(即将文本写入磁盘而不是将其保留在缓存中再刷新): 我已尝试了这两个选项,但都不起作用。任何在异常关闭前几秒钟进行的写操作都会丢失。
有没有办法在Perl中实现几乎确定性的非缓冲IO?我正在运行Windows 7 64位,并且使用Perl 5.8.3。
编辑:我搜索了如何使Windows执行非缓冲IO,以下是如何完成的!调用
- 使用 FILE_FLAG_NO_BUFFERING 作为 dwFlagsAndAttributes 参数调用CreateFile。但是,这样会涉及到内存对齐问题(即文件访问缓冲区应该是扇区对齐的;应用程序可以通过调用GetDiskFreeSpace来确定扇区大小)。
- 使用 WriteFile 将数据写入文件。此写入将是非缓冲的,而不是进入缓存,直接进入磁盘。
- 最后,调用FlushFileBuffers刷新与文件关联的元数据。
请问有人能够协助使用Perl调用Win32 API进行这三个操作吗?
\n
并使用$| = 1
。 - a'r$|
只在当前选择的文件句柄(默认为STDOUT) 上设置自动刷新,而不是所有文件句柄。 - Cameron\n
对于没有连接到终端的句柄是无效的。对于具有自动刷新 ($|=1
) 的句柄,不需要使用\n
。 - ikegami