【问题标题】:Creating a process tree创建进程树
【发布时间】:2016-05-15 10:49:57
【问题描述】:

以下程序应创建深度为K 的进程树,每个节点上都有N 子节点。

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

void spawnNodes(int curLevel, int levelLimit, int childrenNumber, 
                int nodeNumber, int offset)
{
    if (curLevel == levelLimit)
        exit(0);

    curLevel++;
    printf("(%d, %d) Pid: %d with parent %d\n", curLevel, nodeNumber, 
            getpid(), getppid());

    for (int i = 0; i < childrenNumber; i++)
    {
        pid_t childPid = fork();
        if (childPid == -1)
        {
            perror("Couldn't create process");
            exit(1);
        }

        if (childPid == 0)
        {
            spawnNodes(curLevel, levelLimit, childrenNumber, offset + i, 
                       offset + i);
        }
        else
        {
            wait(NULL);
        }
    }
}

int main()
{
    int levelLimit, children;
    scanf("%d %d", &levelLimit, &children);

    spawnNodes(0, levelLimit, children, 0, 0);

    return 0;
}

乍一看,它可能看起来是正确的。但是,有一个我不明白的奇怪行为。进程 1 的第一个儿子比它的最后一个儿子更深一层。

这就是我的意思:

p1--p2---p3--exit(0)
     \---p4--exit(0)
      \--p5--p6--exit(0)

我在gdb 中调试时发现了这一点。此外,这是深度为2 的二叉树的输出:

(1, 0) Pid: 5562 with parent 2835
(2, 0) Pid: 5563 with parent 5562
(2, 1) Pid: 5566 with parent 5563
(2, 1) Pid: 5569 with parent 5562

我做错了什么?

【问题讨论】:

    标签: c linux recursion fork waitpid


    【解决方案1】:

    我做错了什么?

    如果您想为一个进程创建N 子进程,则在创建第一个子进程后不要创建进程wait()


    为了更好地理解发生了什么改变这个

    if (curLevel == levelLimit)
      exit(0);
    

    成为

    if (curLevel == levelLimit) 
      pause(); 
    

    此更改将让每个孩子继续生存,直到它被明确杀死。这样做no 调用wait() 将提前返回。这样您就可以看到每个父母只创建了一个孩子。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2011-11-29
    • 2014-07-27
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多