gpt4 book ai didi

创建进程树

转载 作者:太空狗 更新时间:2023-10-29 11:12:48 24 4
gpt4 key购买 nike

下面的程序应该创建深度为 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

我做错了什么?

最佳答案

What am I doing wrong?

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


为了更好地理解正在发生的事情,改变这个

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

成为

if (curLevel == levelLimit) 
pause();

此更改将使每个 child 继续生存,直到它被明确杀死。这样做 nowait() 的调用将提前返回。这样您就可以看到每个 parent 只创建了一个 child 。

关于创建进程树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37237342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com