3

我必须使用fork()C 语言构建一个进程树。我从标准输入中得到一个数字序列(例如:1 5 0 3),这些数字告诉我每个节点有多少个子节点。如果我们以这个例子为例,那么根进程会创建 1 个子进程,然后这个子进程会创建自己的 5 个子进程,然后从这 5 个子进程中,第一个不会创建任何子进程,第二个进程会创建其中的 3 个,然后我们重做。完成后,根进程调用pstree绘制树。

这是示例的图片:

我的问题是如何从特定节点创建新子节点?一个需要创建 0 个新进程,下一个需要创建 3 个。我不知道如何区分,以便只有那个特定的孩子会产生新的孩子,而不是所有的孩子。另外我不确定如何使用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);
}
}
4

3 回答 3

1

因为pstree,解决方案很简单——每个进程在完成它应该做的事情之后,都会进入睡眠状态(比如说,一分钟)。
然后你可以用它pstree来看看发生了什么。

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

于 2012-05-13T14:22:36.617 回答
1

仅测试您的应用创建的层次结构:

而不是放置一个

return 0; 

正如最后一句话所说

while (1)
  sleep(1);

这使该过程永远运行,直到您按下Ctrl-C

启动应用程序后,使用另一个终端并发出 apstree检查应用程序创建的进程层次结构。

要清理(如果在 linux 上)发出killall <app name>.

于 2012-05-13T15:29:55.217 回答
0

我的一个建议是您使用的返回值fork来判断您的代码是在子进程还是父进程中运行。

于 2012-05-13T16:04:25.647 回答