如何在C程序中禁用操作系统(Ubuntu)缓存

时间:2014-06-27 09:16:23

标签: c caching ubuntu

据我所知,我可以通过使用带有O_DIRECT的open()来禁用OS缓存。但是,如果我愿意使用fopen()而不是open()?

,该如何做到这一点

2 个答案:

答案 0 :(得分:1)

我认为由于O_DIRECT标志的对齐要求,这是不可能的(见that question)。 f ...() - IO系列使用内部缓冲区来缓存IO操作,我不认为标准实现会适当地对齐该缓冲区。

修改

出于特殊目的,我可以想到两个不可移植的解决方案:

  1. 如果您确定,您的文件系统不需要任何特殊对齐,则可以使用fdopen()

    int fd = open( ....., O_WRONLY|O_DIRECT );
    FILE *fp = fdopen( fd, "w" );
    
  2. 如果您只使用Linux,使用fopencookie()可能是一个解决方案: 使用cookieopen()转发'real'fd并提供一个写入函数,将数据复制到适当对齐的缓冲区,然后调用write()(我从未使用过fopencookie()但是,如果使用非标准GNU扩展不是NoGo,我认为值得尝试。
  3. 在这两种情况下都要注意f -...()I / O函数仍然执行内部缓冲,因此在调用write()fflush() <之前可能不会发生真正的fclose() / p>

答案 1 :(得分:0)

从文件读取/写入后,您可以调用fflush()强制文件将所有用户空间缓冲区转储到较低级别的缓冲区。 syncfs()可能对您有用,强制内核清除磁盘上的所有缓冲区。如果你需要更低级别的更大控制,你可能只需要使用open()而不是fopen()。

您可能还希望为您的磁盘和内存设备发布可用的ioctl()调用,以查看是否可以在该级别禁用系统范围内的缓存。