我正在尝试创建流程树,但是这是我现在的输出: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;
}


谢谢!

最佳答案

您的main for循环在所有fork中运行,与您的图表不匹配。
您真正想要的是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


注意sleep()是为了确保所有进程都不会在其子级之前退出,这时将使它们的子级具有ppid = 1(初始值)。

09-28 04:32