C帮助创建进程树

时间:2017-09-26 23:56:43

标签: c fork

我正在尝试创建一个流程树,但这是我现在的输出:https://gyazo.com/a71f4e095b69080a6d6a11edd2c0df27 问题是我想让它看起来像我在右边绘制的图表,但似乎无法弄清楚如何。我打印每个子进程父ID,然后这样做后我将删除它们从2开始,然后是1(通过在5秒后发送SIGKILL信号)。 如何使进程树看起来像所需的结果?这是我的代码:

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


int main()
{
    int root, t1, t2, i;

    root = getpid();
    printf("root %d\n", root);
    for (i = 1; i < 3; i++)
    {
        t1 = fork();
        //printf("%d\n", t1);
        if(t1!=0)
        {
        t2 = fork();
        }
        if (t1 !=0 && t2 != 0)
        {
            break;
        }

        printf("child pid %d    parent pid %d\n", getpid(), getppid());
    }
    sleep(10);

    return 0;
}

谢谢!

1 个答案:

答案 0 :(得分:0)

您的主要for循环在所有分叉中运行,这与您的图表不匹配。 你真正想要的是你的if语句与你的树具有相同的结构:

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


int main()
{
    printf("root %d\n", getpid());

    if (fork())
    {
        fork();
    } else {
        if (fork())
        {
            if (fork())
            {
                fork();
            }
        }
    }

    printf("child pid %d    parent pid %d\n", getpid(), getppid());

    fflush(stdout);

    sleep(10);

    return 0;
}

这给出了期望的结果:

root 5140
child pid 5140    parent pid 377
child pid 5147    parent pid 5141
child pid 5149    parent pid 5141
child pid 5146    parent pid 5140
child pid 5148    parent pid 5141
child pid 5141    parent pid 5140

NB。 sleep()是为了确保没有任何进程在他们的子进程之前退出,此时他们的子进程将被重新设置为ppid = 1(init)。