子进程与C流缓冲:父进程调用setbuf后子进程是否无需重复调用?
问题解答
只在main函数里调用一次setbuf(stdout, NULL)就足够,你看到的正确结果绝不是巧合,原因如下:
setbuf(stdout, NULL)会直接修改stdout对应的FILE结构体的缓冲配置,将其设置为无缓冲模式。- 当调用
fork()创建子进程时,子进程会完整复制父进程的整个地址空间,包括所有FILE结构体的状态。也就是说,父进程提前设置好的无缓冲stdout,会被所有子进程原样继承,不需要在每个子进程里重复调用setbuf。 - 要注意:如果是在
fork()之后父进程才修改缓冲设置,子进程不会同步这个变化;但你是在递归创建子进程之前就完成了设置,所以所有后续fork出来的子进程都会继承无缓冲的stdout配置。
另外补充个小细节:如果之后你的代码里有重新打开stdout的操作(比如用freopen或者dup2替换stdout文件描述符),那可能需要重新调用setbuf;但单纯的fork场景下,一次设置就全流程生效。
内容的提问来源于stack exchange,提问作者Ako1212
相关产品推荐
相关产品推荐

