C语言fork调用后出现非预期重复输出问题求解
问题核心原因:标准输出的行缓冲机制
- 默认情况下,连接到终端的标准输出(stdout)采用行缓冲策略:缓冲区内容仅在遇到换行符
\n、缓冲区被填满、进程正常退出刷新时,才会真正写入终端显示。 - 你代码中
printf("c")没有带换行符,执行后字符c仅暂存在进程用户态的stdout缓冲区中,并没有实际输出到终端。 fork()创建子进程时会完整复制父进程的整个地址空间,其中就包含stdout缓冲区的内容,此时父子进程的缓冲区里各有一份未刷出的c。- 后续父子进程各自执行
printf("d"),会把d写入自己的缓冲区,进程结束前刷新缓冲区时,每个进程都会输出cd,最终总输出就是cdcd。
符合预期输出的修改方案
如果你想要得到预期的cdd输出,任选以下一种修改方式即可:
- 在打印
c时追加换行符:printf("c\n");,换行符会直接触发缓冲区刷新,c会在fork()执行前就输出到终端,不会被复制到子进程。 - 在
fork()调用前手动刷新标准输出:添加fflush(stdout);语句,主动清空缓冲区残留内容。
内容的提问来源于stack exchange,提问作者M_MN
相关产品推荐
相关产品推荐

