C 帮助创建进程树

标签 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;
}

谢谢!

最佳答案

您的主 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

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

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

相关文章:

c - gcc 实际上是否将原型(prototype)视为函数并且它们的参数是否分配了内存?

c - 使用多个进程和 pthread 处理文件

c - ')' token C 之前应为 ';'

c - 进程在 C 中的父进程中挂起

perl - 如何在 Perl 中管理 fork 池?

c - 无限循环和指针

c - C 程序中的浮点输出不正确

c - fork() 之后无法从子进程检索 mmap 共享内存

linux - fork 似乎在不必要的时候进行复制

c - 在 C 中处理信号、管道和分支