如何强制文件描述符缓冲我的输出

How to force a file descriptor to buffer my output

本文关键字:缓冲 我的 输出 描述 何强制 文件      更新时间:2023-10-16

很多人都希望关闭文件描述符的缓冲。我想要相反的结果:我有意配置一个文件描述符,在写入磁盘之前缓冲1K的数据。

原因是我正在为C++类的"flush"函数编写一个单元测试。为了测试它是否工作,我想写一些数据,检查磁盘上文件的大小,然后刷新,然后检查大小是否增长。但在实践中,当我进行第一次文件大小检查时,数据已经写入。

请注意,我在这里使用的是原始文件描述符,而不是流或任何东西。

如果这很重要的话,这是在linux上。

如何强制文件描述符缓冲我的输出

如果使用POSIXwrite()(或其变体(,则不能。

write()调用的行为必须如下:

在对常规文件的write()成功返回后:

  • 文件中每个字节位置的任何成功read(),如果被该写入操作修改,则应返回write(),直到这些字节位置再次修改。

  • 任何后续成功的write()到文件中的相同字节位置都将覆盖该文件数据。

这些要求意味着写入的数据对系统上的任何其他进程都是可见的,为了保持一致,如果写入的数据导致文件大小增加,内核报告的文件大小必须反映写入的数据。

我想写一些数据,检查磁盘上文件的大小,然后刷新,然后检查大小是否增长。

从根本上来说,write()不起作用。文件大小将随着写入的数据而增长-write()不缓冲数据。

如果你想让它做到这一点,你就必须实现你自己的文件系统——一个不符合POSIX的文件系统。