C语言使用fork()和pipe()实现3进程时printf执行两次的原因排查
问题原因
你代码里printf("Sum of first half: %d\n", sum);执行两次的核心原因是:孙进程也会满足id == 0的判断条件,和子进程一起执行了这段打印逻辑。
- 第一次调用
fork()生成子进程后,子进程中id的值为0 - 子进程内部再次调用
fork()生成孙进程,孙进程会继承父进程(也就是你原来的子进程)的所有变量值,所以孙进程的id也为0 - 后续的
if (id == 0)分支没有区分子进程和孙进程,两个进程都会进入该分支执行打印语句,就出现了两次输出。
修复方案
你只需要在孙进程的分支里加exit(0),让孙进程完成自己的打印后直接退出,不要执行后续的逻辑即可:
if (j == 0) { printf("Hello I'm the grandchild\n"); exit(0); // 新增这行,孙进程直接退出,不执行后续代码 }
其他潜在问题建议修复
sum变量未初始化:你定义int sum;时没有给初始值,累加操作会基于栈上的垃圾值计算,结果错误,需要改成int sum = 0;- 重复关闭文件描述符:子进程分支里你连续调用了两次
close(fd[0]);,第二次关闭已经关闭的描述符属于非法操作,删掉重复的close即可 - 管道写端未完全关闭可能导致read阻塞:子进程、孙进程都需要关闭不需要的管道端,避免父进程的read操作一直等不到EOF。
内容的提问来源于stack exchange,提问作者user16984278
相关产品推荐
相关产品推荐

