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

fork创建进程树时出现printf重复输出,如何避免该问题?

解决fork创建进程树时printf重复输出的问题

我来帮你拆解下问题根源,再给出修复方案。

你代码里的核心问题是:在第一个子进程的分支中,调用fork()后没有立刻区分进程身份,直接执行了printf语句。fork()会生成两个进程——原第一个子进程(此时成为新子进程的父进程,pid返回值大于0)和新的孙进程(pid返回值为0),这两个进程会共享后续的执行流,自然就导致同一条printf被重复输出了。

咱们的修复思路很明确:每次调用fork()后,立刻通过返回的pid值判断当前进程角色,把不同进程的执行逻辑完全分开,避免共享代码块导致重复操作。

修改后的代码示例(结构更清晰)

#include<stdio.h> 
#include<unistd.h>
#include<sys/types.h> 
#include <sys/wait.h> 
#include <stdlib.h> 

int main () { 
    pid_t pid; 
    printf("Parent of all: %ld\n",(long)getpid()); 

    // 创建第一个子进程
    pid = fork(); 
    if(pid == -1){
        perror("fork failed"); 
        exit(EXIT_FAILURE); 
    } 

    if (pid == 0){
        // 第一个子进程:先打印自身信息
        printf("Child 1 id: %ld, Parent id: %ld \n", (long)getpid(),(long)getppid());
        
        // 创建第一个孙进程
        pid_t grandchild1 = fork();
        if(grandchild1 == -1){
            perror("fork failed");
            _exit(EXIT_FAILURE);
        }
        if(grandchild1 == 0){
            // 第一个孙进程的逻辑
            printf("Grandchild 1 id: %ld, Parent id: %ld \n", (long)getpid(),(long)getppid());
            _exit(EXIT_SUCCESS);
        }

        // 创建第二个孙进程
        pid_t grandchild2 = fork();
        if(grandchild2 == -1){
            perror("fork failed");
            _exit(EXIT_FAILURE);
        }
        if(grandchild2 == 0){
            // 第二个孙进程的逻辑
            printf("Grandchild 2 id: %ld, Parent id: %ld \n", (long)getpid(),(long)getppid());
            _exit(EXIT_SUCCESS);
        }

        // 可选:让第一个子进程等待所有孙进程结束
        wait(NULL);
        wait(NULL);
        _exit(EXIT_SUCCESS);
    } 

    // 顶层父进程等待第一个子进程结束
    int status; 
    waitpid(pid, &status, 0); 

    return EXIT_SUCCESS; 
}

关键注意点

  • 每次fork()后必须立刻判断返回值,将父、子进程的代码逻辑完全隔离
  • 子进程要使用_exit()或exit()主动终止,防止继续执行父进程的剩余代码
  • 尽量让每个进程的职责单一,避免多个进程共享同一段输出或业务代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:06:45