GCC中fork()执行前的printf为何重复输出且换行符不生效?
问题根因说明
重复输出的原因
- C标准库的
printf对终端输出默认采用行缓冲策略,只有满足三个条件之一才会把缓冲区内容写入真实终端:遇到换行符\n、缓冲区被填满、程序主动调用fflush/进程正常退出。 - 你的代码里
printf("\nPid iniziale %d",pid);的换行符放在字符串开头,执行完printf后,Pid iniziale 1572这段内容还留在父进程的stdout缓冲区里,没有被刷出。 fork()调用会完整复制父进程的用户空间内存,其中就包括未刷新的stdout缓冲区,所以子进程的缓冲区里也存在完全相同的待输出内容。- 后续父子进程各自退出时,都会主动刷新自身的缓冲区,最终就会输出两次相同的内容。
换行符未生效的原因
你放在字符串开头的\n确实被写入了缓冲区,只是因为缓冲区没有被及时刷新,最终输出时这个换行符出现在所有打印内容的最前面,两次打印的Pid iniziale内容因为没有后缀换行符,所以直接拼接在一起,看起来就像换行符没有生效。
修复方案
二选一即可:
- 将换行符移到printf字符串末尾:
printf("Pid iniziale %d\n",pid);,执行完printf后会自动触发行缓冲刷新,fork时子进程不会复制到残留的输出内容。 - 在printf之后、fork之前手动清空缓冲区:添加代码
fflush(stdout);,强制把缓冲区内容全部输出并清空。
内容的提问来源于stack exchange,提问作者epiclol
相关产品推荐
相关产品推荐

