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

使用fork()创建n个子进程并在全部创建及父进程执行完成后处理子进程

问题原因

你的代码中子进程被创建后会直接执行自身逻辑并退出,没有等待父进程完成全部子进程创建、以及父进程自身逻辑执行完毕的流程,所以会出现子进程提前运行的问题。

解决方案

我们可以通过信号通知机制实现需求:子进程创建后先阻塞等待父进程的通知信号,父进程完成所有子进程创建和自身逻辑后,再批量通知所有子进程开始执行。

修改后完整代码

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

#define STRLONG 1024
// 空信号处理函数,仅用于捕获信号让pause()正常返回
void empty_handler(int sig) {}

int main(int argc, char *argv[])
{
    char cadena[STRLONG];
    pid_t pid;
    // 存储所有子进程PID,方便后续批量发通知信号
    pid_t child_pids[5];

    // 注册SIGUSR1信号的处理逻辑
    signal(SIGUSR1, empty_handler);
    
    for(int i =0; i<5; i++){
        pid = fork();
        if(pid == -1){
            perror("fork error");
            exit(-1);
        } else if(pid == 0){
            // 子进程阻塞挂起,等待父进程的通知信号
            pause();
            // 收到信号后再执行子进程业务逻辑
            printf("I'm the child --> %d \n", getpid());
            exit(0);
        } else {
            // 父进程保存刚创建的子进程PID
            child_pids[i] = pid;
        }
    }

    // 父进程自身逻辑执行
    printf("I'm the parent, --> %d\n", getpid());

    // 父进程给所有子进程发信号,通知它们可以开始执行
    for(int i = 0; i<5; i++){
        kill(child_pids[i], SIGUSR1);
    }

    // 等待所有子进程执行完毕退出
    for(int i = 0; i<5; i++){
        wait(NULL);
    }

    return 0;
}

逻辑说明

  • 提前定义数组存储所有子进程的PID,用于父进程后续批量发送通知信号
  • 注册空的SIGUSR1信号处理函数,避免子进程收到信号后触发默认终止逻辑
  • 子进程创建后先调用pause()阻塞挂起,直到收到父进程的信号才会继续向下执行
  • 父进程完成5个子进程的全部创建、执行完自身逻辑后,遍历PID数组给所有子进程发送SIGUSR1信号唤醒子进程
  • 最后父进程等待所有子进程执行完毕后再退出

内容的提问来源于stack exchange,提问作者angel.bn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:27:02