我正在为 C 编写一个 REPL(读取执行打印循环)。我尝试维护一个头文件,以便我可以基于以前的函数定义新函数。每当我定义一个新函数时,我都会得到一个新的临时文件,如下所示:
#include "/tmp/header.h"
int foo() {
return func() * func();
}
/tmp/header.h
就像:
int func();
int foo();
其中 func()
是先前定义的函数。
所以我需要一次又一次地对 header_fileno
调用 write()
。我担心的是---在我调用write(header_fileno, buf, wrsize)
之后,buf
的内容是否有可能存储在某个内核中缓冲区而不是写入实际文件?因为如果发生这种情况,我就不能指望 header 给出最新的声明。当涉及到源文件时,我也有同样的担忧。如果出现这种情况,有没有办法让它立即生效?
最佳答案
您可以放心地假设,在调用 write()
之后调用 read()
的任何进程(包括当前进程)都会看到更新后的文件,即使文件仍在内核缓冲区中并且未完全写入磁盘。 POSIX mandates这种行为:
If a read() of file data can be proven (by any means) to occur after a write() of the data, it must reflect that write(), even if the calls are made by different processes.
话虽如此,如果您使用 stdio 函数,则这不适用,该函数可能会在写入之前缓冲数据。它还不能保证您的数据在系统崩溃时不会丢失或损坏;如果您需要这种保证,则必须使用 fsync()
或使用 O_SYNC
打开文件。
关于linux - 如何让Linux上的 `write()`系统调用立即生效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55886527/