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

按数组元素创建层序子进程失败,寻求正确实现方案

进程层级结构生成问题解决方案

问题核心

需求是基于给定整数数组生成层级进程结构:每个进程对应数组的一个索引,按层序创建子进程,数量等于数组对应索引的数值。例如数组{2,3,1,0,0,0,0}的结构要求:

  • 初始父进程(索引0)创建2个子进程(索引1、2)
  • 索引1的进程创建3个子进程(索引3、4、5)
  • 索引3的进程创建1个子进程(索引6)
  • 其余索引的进程不创建子进程

现有代码的问题

当前代码逻辑错误:主进程循环调用createChild,所有子进程都由主进程直接创建,完全没有层级关系;且子进程创建后立即exit,无法继续创建自己的子进程,完全不符合需求中的层级结构要求。

解决方案逻辑

要实现层级结构,必须让每个进程根据自己的索引创建对应数量的子进程,且子进程需要承接后续的创建任务。核心思路:

  • 每个进程对应数组的一个索引,创建子进程时,子进程的索引按层序依次递增
  • 子进程创建后,递归处理自己的子进程创建逻辑
  • 父进程等待所有子进程完成创建,保证层级顺序

修正后的代码

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

void create_processes(int *arr, int size, int current_idx) {
    // 打印当前进程信息
    printf("[进程] PID: %d, 父PID: %d, 索引: %d\n", getpid(), getppid(), current_idx);

    int num_children = arr[current_idx];
    if (num_children == 0 || current_idx + 1 >= size) {
        return;
    }

    pid_t pid;
    int next_start_idx = current_idx + 1;
    for (int i = 0; i < num_children; i++) {
        int child_idx = next_start_idx + i;
        if (child_idx >= size) break;

        pid = fork();
        if (pid < 0) {
            perror("fork失败");
            exit(EXIT_FAILURE);
        } else if (pid == 0) {
            // 子进程处理自己的子进程创建
            create_processes(arr, size, child_idx);
            exit(EXIT_SUCCESS);
        }
    }

    // 父进程等待所有子进程结束
    for (int i = 0; i < num_children; i++) {
        wait(NULL);
    }
}

int main() {
    int arr[] = {2, 3, 1, 0, 0, 0, 0};
    int size = sizeof(arr) / sizeof(int);

    create_processes(arr, size, 0);

    return 0;
}

代码说明

  • 每个进程通过current_idx关联数组中的元素,首先打印自身PID、父PID和索引
  • 根据arr[current_idx]的数值创建对应数量的子进程,子进程的索引从current_idx + 1开始依次分配
  • 子进程递归调用create_processes,继续创建自己的子进程
  • 父进程调用wait等待所有子进程完成,确保层级结构按预期生成

内容的提问来源于stack exchange,提问作者rudy haddad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:42:52