You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC中fork与带/不带换行的printf异常行为原因排查

关于fork后printf重复输出的问题解答

这不是GCC的Bug,问题根源出在标准输出的行缓冲机制上,具体分析如下:

核心差异原因

  • 例1中printf("before-fork\n")包含换行符\n:
    标准输出默认针对终端采用行缓冲模式,换行符会触发缓冲区立即刷新,"before-fork"在fork()调用前就已经被输出到终端,此时缓冲区为空。fork()创建的子进程继承的是空缓冲区,不会再输出这段内容,最终只会打印一次"before-fork"。

  • 例2中printf("before-fork ")没有换行符:
    此时输出内容会暂存在用户空间的缓冲区中,并未被刷新到终端。当fork()调用时,子进程会完整复制父进程的地址空间,包括这个未刷新的缓冲区。后续父进程和子进程退出时,都会自动触发缓冲区刷新,导致"before-fork "被输出两次。

补充说明

标准输出的缓冲规则:

  • 输出到终端时,默认是行缓冲,遇到换行符、缓冲区满或程序退出时刷新;
  • 输出到管道、文件等非终端设备时,默认是全缓冲,只有缓冲区满或手动刷新时才会输出。

如果要让例2和例1输出一致,只需在fork()调用前手动刷新缓冲区:

fflush(stdout);

内容的提问来源于stack exchange,提问作者Rajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:55:58