Linux - 禁用缓冲 I/O 到子进程中的文件

标签 linux buffering

在我的应用程序中,我创建了一堆子进程。 fork() 之后,我打开每个进程文件,将创建的进程的 stdout/stderr 设置为指向该文件,然后执行预期的程序。

父进程是否可以选择这样一种设置方式,即当子进程执行 printf 时,它会立即刷新到输出文件而无需调用 flush() ?或者是否有可以从子进程本身(在 exec 之前)调用的 API 来禁用缓冲 I/O?

最佳答案

这里的问题是 printf 被缓冲了。底层文件描述符不是以这种方式缓冲的(它们在内核中缓冲,但另一端可以从同一个内核缓冲区读取)。您可以使用 setvbuf 更改缓冲,如评论中所述,这应该是一个答案。

setvbuf(stdout, NULL, _IONBF, 0);

您不需要为 stdinstderr 执行此操作。

您不能从父进程执行此操作。这是因为缓冲区是由子进程创建的。父进程只能操作底层文件描述符(位于内核中),而不能操作 stdout(C 库的一部分)。

P.S. 你的意思是 fflush,而不是 flush

关于Linux - 禁用缓冲 I/O 到子进程中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7800979/

相关文章:

linux - pry -r ./config/environment 与 pry -r config/environment 不同

linux - 捕获 Chrome 发送的流量

python:读取线程中的子进程输出

ethernet - libpcap 没有实时接收,似乎正在缓冲数据包

linux - 如何在linux中编译运行汇编代码

linux - 如何在 xfs 中获取文件创建日期/时间

linux - 无法识别的 Vim 键盘映射

javascript - HTML5 Video buffered 属性特性

html - 减少 html5 音频标签缓冲区

c++ - 在 C++ 中处理许多进程的中央数据缓冲区