gpt4 book ai didi

c - 使用 fork() 的进程树不均匀

转载 作者:行者123 更新时间:2023-12-02 22:34:44 24 4
gpt4 key购买 nike

我必须在 C 中使用 fork() 构建一个进程树。我从标准输入中获取一系列数字(例如:1 5 0 3),这些数字告诉我有多少个进程每个节点都有子节点。如果我们举个例子,根进程创建 1 个子进程,然后这个子进程创建自己的 5 个子进程,然后在这 5 个子进程中,第一个子进程不会创建任何子进程,第二个进程创建其中 3 个子进程,然后我们'重做。完成此操作后,根进程调用 pstree 来绘制树。

这是示例的图片:

我的问题是如何从特定节点创建新的子节点?一个需要创建 0 个新进程,下一个需要创建 3 个新进程。我不知道如何区分,以便只有特定的 child 才能生出新 child ,而不是所有 child 。另外,我不确定如何使用 pstree,因为当调用 pstree 时,树通常已经消失了。我知道我可以 wait() 让子级首先执行,但最后一个没有任何子级可以等待,因此它们结束得太快。

我已经编写了创建示例的代码。需要想法如何将其推广到不同的输入。另外有人可以告诉我如何从这段代码中调用 pstree,因为我似乎无法让它工作。

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


int main() {

pid_t pid;
pid_t temppid;
pid_t temppid2;
int root_pid;
int status;

root_pid = getpid();

pid = fork(); // creates a child from root
if (pid == 0) { // if child
pid = fork(); // fork again (child#1)
if (pid != 0) { // if not child of child#1
temppid = getpid(); // get pid
if (getpid() == temppid) { // create child#2
pid = fork();
if (pid == 0) {
temppid2 = getpid();
if (getpid() == temppid2) { // create child#1
fork();
}
if (getpid() == temppid2) { // create child#2
fork();
}
if (getpid() == temppid2) { // create child#3
fork();
}
}
}
if (getpid() == temppid) { // create child#3
fork();
}
if (getpid() == temppid) { // create child#4
fork();
}
if (getpid() == temppid) { // create child#5
fork();
}
}
}
else {
// create another child from root
pid = fork();
if (pid == 0) {
// run pstree in this child with pid from root
}
}

while (1) {
sleep(1);
}
}

最佳答案

对于 pstree,解决方案很简单 - 每个进程在完成其应该执行的操作后,都会进入休眠状态(例如,一分钟)。
然后您可以使用 pstree 来查看发生了什么。

为了 fork 正确的次数,问题似乎在于解析输入,而不是 fork 。
我首先编写读取输入的代码,而不是 fork ,只打印您想要创建的进程树。一旦你清楚了这一点,它就不应该能够正确地进行 fork 。

关于c - 使用 fork() 的进程树不均匀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10572218/

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