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

多进程Fork:父进程如何创建两组子进程分别执行不同函数

如何让父进程创建两组执行不同函数的子进程

嘿,这个问题其实很好解决~核心要抓住一个关键点:只有父进程负责创建所有子进程,子进程执行完自己的任务就立刻退出,别跟着跑父进程后续的代码。

你原来的代码已经能正确创建一组子进程执行function(),那要加另一组执行另一个函数(比如function2()),只需要在第一个fork循环结束后,再写一个逻辑完全类似的循环就行。

完整代码示例

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

// 第一组子进程要执行的函数
void function() {
    printf("Child %d: Running function()\n", getpid());
}

// 第二组子进程要执行的函数
void function2() {
    printf("Child %d: Running function2()\n", getpid());
}

int main() {
    pid_t pid;
    int first_group_count = 3; // 第一组子进程的数量
    int second_group_count = 2; // 第二组子进程的数量
    int i;

    // ===== 创建第一组子进程 =====
    for (i = 0; i < first_group_count; ++i) {
        if ((pid = fork()) < 0) {
            perror("Failed to fork for first group");
            continue; // 出错了也继续尝试创建剩下的子进程
        } else if (pid == 0) {
            // 子进程:执行函数后立刻退出
            function();
            exit(EXIT_SUCCESS);
        }
        // 父进程:啥也不用做,继续循环创建下一个子进程
    }

    // ===== 创建第二组子进程 =====
    for (i = 0; i < second_group_count; ++i) {
        if ((pid = fork()) < 0) {
            perror("Failed to fork for second group");
            continue;
        } else if (pid == 0) {
            function2();
            exit(EXIT_SUCCESS);
        }
    }

    // ===== 父进程等待所有子进程结束 =====
    int status;
    // 循环等待,直到所有子进程都退出(wait返回-1时表示没有子进程了)
    while (wait(&status) > 0) {
        // 可以在这里处理子进程的退出状态,比如判断是否正常退出
        if (WIFEXITED(status)) {
            printf("Child exited with status %d\n", WEXITSTATUS(status));
        }
    }

    printf("All children have finished. Parent process exiting.\n");
    return EXIT_SUCCESS;
}

关键逻辑解释

  1. 子进程必须退出:每个子进程执行完目标函数后立刻调用exit(),这样就不会进入后续的循环(比如第二组的fork循环),避免子进程再创建额外的子进程,导致混乱。
  2. 父进程持续创建:父进程在每次fork后,拿到子进程的PID,直接继续下一次循环,完成第一组的创建后,再进入第二组的循环,继续创建另一批子进程。
  3. 等待所有子进程:最后的while(wait(&status) > 0)会等待所有子进程退出,不管是哪一组的,这样能避免僵尸进程的产生。如果需要单独等待某一组的子进程,可以提前保存每个子进程的PID,然后用waitpid()逐个等待,但大多数场景下,统一等待所有子进程就足够了。

额外提醒

  • 错误处理部分可以根据你的需求调整,比如如果fork失败,是否要终止整个程序,还是继续创建剩下的子进程。
  • 如果两组子进程需要有不同的执行逻辑(比如传递不同的参数),只需要在子进程里调用函数时传入对应的参数即可,核心的fork逻辑不变。

内容的提问来源于stack exchange,提问作者Jordan C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:44:40