c - 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;
}


谢谢!

最佳答案

您的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(初始值)。

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

相关文章:

c - dbx:警告:使用 srcline 信息进入函数

javascript - 适用于 C 和 Javascript 的 Base64 库

c - 获取字符串的开头,直到给定字符

c - 在几个 header 中重新定义 'struct timeval'

android - 如何使 native C 可执行文件在 Android 中永远运行?

c - 我的 fork fifo c 代码不能正常工作

c - 无法理解 fork() 的保证

c - fork 进程,信号量,为什么这个输出?

c - 在文本文件中粗线(Windows)

c - 如何多次向 child 发送信号以避免僵尸状态? C语言