繁体   English   中英

此程序创建多少个进程,以及它们是由哪个进程创建的?

[英]How many processes are created by this program, and by which processes are they created by?

我正在跟踪该程序,并确定创建了多少个进程(假设没有发生错误)。 我画了一张图以可视化过程。 在我的图中,第一个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行上的第一个fork()命令创建了子级1
  • 第5行的第二个fork()命令仅因1创建子2 ,因为if(child1 == 0) ,即,只有fork()child1返回0的进程是1
  • 该第三fork()第7行命令创建子301 ,和2 ,因为该语句是由每个进程执行。
  • 所述第四fork()第10行命令创建子4对每一个工艺除2 ,因为每个进程具有的副本child2将其返回从正值fork()除了2 ,这将在具有0 child2

你怎么看? 我是否解释了此代码并正确绘制了图形?

UPDATE

正确的图形是:

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

应用于示例的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---------------

分支重新排序后,它与@Macattack的答案匹配。

请注意,在上图中您没有有关流程创建的相对时间的信息;这只是最终结果。

为了理解该图,让我们看一下父进程派生后的树:

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选项来防止这种情况,并查看完整的树。

下面是我的解释,你可以决定是否匹配你的,我不太明白说像“创建子301 ,和2 ”,因为每个将是一个独立的孩子。

我的代码副本:

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
|   |  | | | | |   |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM