2013-11-22 32 views
0

我正在跟踪此程序并确定创建了多少个进程(假设没有发生错误)。我绘制了一个图形来显示过程。在我的图中,由第一个fork()创建的第一个过程包含一个1,并且每个父级都有指向每个子进程的箭头。这看起来是否正确?该程序创建了多少个进程,以及它们由哪些进程创建?

代码:

1: child2 = 0; 
2: child1 = fork();  // fork 1 
3: if (child1 == 0) 
4: { 
5:  child2 = fork(); // fork 2 
6: } 
7: fork();    // fork 3 
8: if (child2 > 0) 
9: { 
10:  fork();   // fork 4 
11: } 

图:

    0 
       /|\ 
      /| \ 
       1 3 4 
      /\ \ 
      / \ \ 
      2  3 4 
     / /
     / / 
     3  4 
    /
    /
    4 

理由

  • 第2行创建的子1首届fork()命令。
  • 第5行的第二fork()命令创建子2仅对1,由于if(child1 == 0),即只有处理具有fork()返回0至child11
  • 第7行上的第3个fork()命令为0,12创建了孩子3,因为该语句是由每个进程执行的。
  • 第10行创建的子4的第四fork()命令除外2每个过程,因为每个进程具有child2其副本被送回从fork()正值,除了2,这将有一个在child2 0。

您怎么看?我解释了这段代码并正确地绘制了它吗?

UPDATE

正确图为:

    0 
       /\ 
      / \ 
       1  3 
      /|\ 
      /| \ 
      2 4 3 
     /  \ 
     /  \ 
     3   4 

回答

1

这里是我的解释,你可以决定是否匹配你的,我不太明白说像“创建子3012“,因为每个人都是独立的孩子。

我的代码的副本:

int main(void) { 
    int child2 = 0; 
    int child1 = fork(); // fork 1 
    if (child1 == 0) 
    { 
     child2 = fork(); // fork 2 
    } 
    fork();    // fork 3 
    if (child2 > 0) 
    { 
     fork();   // fork 4 
    } 
    printf("%jd\n", getpid()); 
} 

图:(父左,孩子右)

|  
|\_____ // fork 1 
|  | 
|  |\______ // fork 2 
|  |  | 
|\__ |\__ |\__ // fork 3 
| | | | | | 
| | |\ |\ | | // fork 4 
| | | | | | | | 
+0

谢谢。我现在看到我犯了我的错误。我认为你的解释是正确的。 –

3

应用到您的示例pstree命令显示:

 bash-+-a.out-+-a.out-+-a.out---a.out 
        |  |-a.out---a.out 
        |  `-a.out 
        `-a.out 

这如下所示,每行只有一个进程。

 bash-+-a.out-+--------------------- 
        +-a.out-+------------- 
        |  +-a.out------- 
        |  |  `-a.out 
        |  |-a.out------- 
        |  |  `-a.out 
        |  `-a.out------- 
        `-a.out--------------- 

其中,分支重新排序后,匹配@马卡塔克的答案。

请注意,上图中没有关于过程创建的相关时间的信息,它只是最终结果。

要理解图,让我们来看看树父进程叉后:

int main(void) { 
    int child1 = fork(); 
} 

结果是:

bash-+-a.out---a.out 
     ^parent ^child 

然后,如果再次孩子叉,

int main(void) { 
    int child2 = 0; 
    int child1 = fork(); 
    if (child1 == 0) 
     child2 = fork(); 
} 
我们得到:
bash-+-a.out---a.out---a.out 
     ^parent ^child ^grandchild 

但如果家长叉再次诡计孩子没有,

int main(void) { 
    int child2 = 0; 
    int child1 = fork(); 
    if (child1 > 0) 
     child2 = fork(); 
} 

我们得到:

bash-+-a.out-+-a.out <- child1 
     ^ `-a.out <- child2 
      parent 

注意pstree压缩通过合并相同的兄弟姐妹的输出;你需要使用-c选项来防止这种情况并查看完整的树。

+1

从来不知道这样的命令存在。我的理论的进一步证明,有一个任何你可能想要在Linux上执行的命令;) – Macattack

+0

我不明白如何阅读这个图。 –