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

