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