据我所知,我可以通过使用带有O_DIRECT的open()来禁用OS缓存。但是,如果我愿意使用fopen()而不是open()?
,该如何做到这一点答案 0 :(得分:1)
我认为由于O_DIRECT
标志的对齐要求,这是不可能的(见that question)。 f ...() - IO系列使用内部缓冲区来缓存IO操作,我不认为标准实现会适当地对齐该缓冲区。
修改强>
出于特殊目的,我可以想到两个不可移植的解决方案:
如果您确定,您的文件系统不需要任何特殊对齐,则可以使用fdopen()
:
int fd = open( ....., O_WRONLY|O_DIRECT );
FILE *fp = fdopen( fd, "w" );
cookie
从open()
转发'real'fd并提供一个写入函数,将数据复制到适当对齐的缓冲区,然后调用write()
(我从未使用过fopencookie()
但是,如果使用非标准GNU扩展不是NoGo,我认为值得尝试。在这两种情况下都要注意f -...()I / O函数仍然执行内部缓冲,因此在调用write()
或fflush()
<之前可能不会发生真正的fclose()
/ p>
答案 1 :(得分:0)