在我的应用程序中,我创建了一堆子进程。 fork() 之后,我打开每个进程文件,将创建的进程的 stdout/stderr 设置为指向该文件,然后执行预期的程序。
父进程是否可以选择这样一种设置方式,即当子进程执行 printf 时,它会立即刷新到输出文件而无需调用 flush() ?或者是否有可以从子进程本身(在 exec 之前)调用的 API 来禁用缓冲 I/O?
最佳答案
这里的问题是 printf
被缓冲了。底层文件描述符不是以这种方式缓冲的(它们在内核中缓冲,但另一端可以从同一个内核缓冲区读取)。您可以使用 setvbuf
更改缓冲,如评论中所述,这应该是一个答案。
setvbuf(stdout, NULL, _IONBF, 0);
您不需要为 stdin
或 stderr
执行此操作。
您不能从父进程执行此操作。这是因为缓冲区是由子进程创建的。父进程只能操作底层文件描述符(位于内核中),而不能操作 stdout
(C 库的一部分)。
P.S. 你的意思是 fflush
,而不是 flush
。
关于Linux - 禁用缓冲 I/O 到子进程中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7800979/