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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:27:04