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
相关产品推荐
相关产品推荐

