Unix:叉到树上

时间:2017-03-22 20:31:15

标签: c unix fork

我是unix shell编程的新手,我很难得到关于分叉及其树木的好解释。我现在所知道的是,fork类是从主(父)中复制进程(子进程)。

更具体地说,我无法从一段代码中获得流程树的样子。

例如,在这个代码骨干上:

pid1=fork();
if (pid1!=0) 
{   
    pid2=fork(); 
    pid3=fork(); 
}
else 
{ 
    pid4=fork(); 
} 

在我看来,原始过程下有3个进程(pid1,pid2,pid3)和这三个进程中的一个(pid4),也许是pid2&#39。

我尝试使用一些编写得非常好的代码来运行它:

int pid1, pid2, pid4, pid4;

printf("I'm the original Process %d with parent %d \n", getpid(), getppid());

pid1=fork();

if(pid1!=0)
{
    pid2=fork();
    printf("I'm P2 %d with parent %d \n", getpid(), getppid());
    sleep(1);

    pid3=fork();
    printf("I'm P3 %d with parent %d \n", getpid(), getppid());
    sleep(1);
}
else
{
    pid4=fork();
    printf("I'm P4 %d with parent %d \n", getpid(), getppid());
    sleep(1);
}

编辑:我在上面的代码中放了一些睡眠(1),感谢dbush,所以我可以看到ppid'

enter image description here

那么,树是如何用这些类型的代码形成的?

1 个答案:

答案 0 :(得分:2)

你总共会得到5个孩子:

                  c2--------------
                    |             
                    |             
     c1---------------------------
       |           p4             
       |                          
       |                          
       |                          
       |                c5--------
       |                  |       
       |                  |       
       |       c3-----------------
       |         |       p3       
       |         |                
       |         |      c4--------
       |         |        |       
       |         |        |       
p---------------------------------
      p1        p2       p3

第一个分支发生在p1点,它创建了子c1。这个孩子进入代码的else部分并在p4点运行分叉,创建子c2

回到父级,它在创建子p2的点c3处分叉。 这两个进程的然后在点p3分叉,创建子c4c5

您看到某些进程将其父级报告为1的原因是因为父级正在子级之前完成。尝试将sleep(1)放在此块的底部,以便为父进程留出时间,让孩子们可以看到它们。