C语言Linux环境下父进程创建3个子进程实现问题咨询
问题解决思路与修正代码
核心问题定位
- 你当前代码只调用了1次
wait(),该函数每次仅会回收1个终止的子进程,因此父进程只会等待第一个退出的子进程就继续执行后续逻辑,无法满足等待全部3个子进程的要求 - 你没有做进程存活状态的核验逻辑,因此无法直接证明3个子进程和父进程同时存在
解决方案
1. 父进程等待所有子进程终止的实现
你可以通过两种方式实现:
- 明确循环调用3次
wait(),对应你创建的3个子进程 - 用
while(wait(NULL) > 0)的通用写法,只要还有未回收的子进程就持续等待,不需要提前知道子进程数量
如果需要获取每个子进程的返回值,需要让子进程显式调用exit()自定义退出码,再通过WEXITSTATUS()解析wait()拿到的状态变量即可。
2. 证明所有进程同时存在的实现
你可以在所有子进程都创建完成后、父进程开始回收子进程前,调用system("ps -f")打印当前系统的进程列表,输出中可以直接看到父进程PID和3个PPID等于父进程PID的子进程同时存活。同时可以给每个子进程加sleep(2)逻辑,保证子进程不会在ps执行前就退出。
修正后完整代码
#include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> int main() { int i; int var = 0; pid_t parent_pid = getpid(); printf("I am the Parent, my ID: %d\n", parent_pid); for( i = 0; i < 3; i++ ) { if(var == 0) { pid_t fork_ret = fork(); if( fork_ret == 0 ) { var++; printf("Child %d: PID: %d; PPID: %d\n", i+1, getpid(), getppid() ); printf("Var:%d \n", var); // 子进程休眠2秒,保证ps执行时仍存活 sleep(2); // 自定义退出码,方便父进程获取 exit(i+1); } } } // 父进程执行ps命令,打印当前进程列表,证明所有进程同时存在 printf("\n===== 当前运行进程列表 =====\n"); system("ps -f"); printf("============================\n\n"); int status; pid_t waited_pid; // 循环等待所有子进程退出 while((waited_pid = wait(&status)) > 0) { if(WIFEXITED(status)) { printf("父进程回收子进程 %d,退出码:%d\n", waited_pid, WEXITSTATUS(status)); } } printf("父进程 %d 所有子进程已回收,执行后续逻辑,说bye!\n", parent_pid); return 0; }
输出说明
修正后的代码运行后会先打印父进程PID,再依次打印3个子进程的信息,之后输出进程列表,你可以在列表中看到4个相关进程:1个父进程+3个PPID等于父进程PID的子进程,直接证明所有进程同时存在。之后父进程会依次回收3个子进程并打印每个子进程的退出码,全部回收完成后才会打印最后的bye信息,满足父进程等待所有子进程终止后再执行后续逻辑的要求。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

