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