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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:48:02