C中打开(... O_DIRECT)的可移植性?

时间:2009-05-29 08:05:20

标签: c file caching disk

在C文件I / O中,O_DIRECT标志可用于最小化open()文件的缓存效果。据我所知,这不是POSIX功能,自2.4.10版以来一直存在于Linux内核中,并且Linus一般都反对该接口。在NetBSD下,它似乎像宣传的那样工作。示例电话:

int fd = open(filename, O_DIRECT);

我正在尝试编写一些低级磁盘基准测试实用程序,并且使用O_DIRECT看起来是一种测量磁盘和驱动器性能的潜在好方法,而不受OS文件系统/块缓存的影响。理想情况下,我希望能够在Linux,Windows(Cygwin可以),Mac OS X和BSD系统上运行基准测试。在基准性的可移植性和可靠性方面,O_DIRECT是绕过操作系统磁盘高速缓存的最佳方式吗?还有其他选择吗?

3 个答案:

答案 0 :(得分:2)

对于Windows,您应该查看CreateFile函数,标志为FILE_FLAG_NO_BUFFERING和FILE_FLAG_WRITE_THROUGH。 (http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx)。 但是你必须使用windows函数进行读写:SetFilePointer,WriteFile,ReadFile ......

答案 1 :(得分:1)

O_DIRECT甚至不存在于Mac OS X上(我只是在/ usr / include中使用它而且它不在那里)。至于Linux,你的工具会做什么,hdparm没有?

答案 2 :(得分:1)

我不认为Windows支持它 - 至少我在MSDN中找不到提及。这意味着它可能会得到Cygwin的支持,因为Cygwin需要使用底层的Windows操作系统。