perl中的无缓冲IO

San*_*osh 3 windows io perl unbuffered

我有一个Perl应用程序,它使用open和print调用将日志写入文件.

open (FH, "d:\\temp.txt");
print FH "Some log";
close (FH);
Run Code Online (Sandbox Code Playgroud)

但是,在机器突然关闭期间,日志不会持久保存到文件中.因此,在几个地方搜索之后,建议使用两个选项来执行无缓冲的IO(即将文本写入磁盘而不是将其保存在缓存中然后将其刷新):

  1. sysopen,syswrite
  2. $ | = 1;

我已经尝试了这两个选项,它只是不起作用.在异常关闭之前我做的任何写操作都会丢失.

有什么方法可以在Perl中几乎确定地完成无缓冲的IO?我使用Perl 5.8.3运行Windows 7 64位.

编辑:我搜索了如何让Windows执行无缓冲的IO,这是如何做到的!呼叫

  1. 的CreateFile与FILE_FLAG_NO_BUFFERING dwFlagAndAttributes可以.但是,这需要考虑内存对齐问题(即文件访问缓冲区应该是扇区对齐的;应用程序通过调用GetDiskFreeSpace来确定扇区大小)
  2. 使用WriteFile将数据写入文件.这个写入是无缓冲的,而不是去缓存,它直接进入磁盘.
  3. 最后,调用FlushFileBuffers来刷新与文件关联的元数据.

有人可以帮助Perl的Win32 API进行这3次调用.

ike*_*ami 6

use IO::Handle;
open(FH, "d:\\temp.txt");
FH->autoflush(1);
print FH "Some log";
close(FH);
Run Code Online (Sandbox Code Playgroud)

这将尽快将其发布到操作系统,但操作系统可能需要一段时间才能将其提交到磁盘.我仍然相信你会发现这会满足你的需求.

如果您使用的是unix,我会引用您同步以获取有关将操作系统提交数据到磁盘的更多信息.