linux - 如何让Linux上的 `write()`系统调用立即生效?

标签 linux system-calls fwrite

我正在为 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/

相关文章:

linux - 为什么我不能重定向标准输出/错误以登录 Linux

linux - 编写内核(Linux)模块,保存进程页面免于删除到交换区

linux-kernel - linux系统调用中的参数传递

python - 系统调用和信号处理程序

c - 在C中的二进制文件中写入字节0

PHP fwrite() 不工作

c - 如何将三维动态字符数组写入和读取到文件?

linux - 如何将两个目录的差异复制到一个新目录?

c++ - 使用 pthread_cancel : good practice or bad 取消线程

c - 在C中逐行读取文件(不使用fgets)