2017-02-01 46 views
4

我不明白爲什麼它會打印8次文字。在我的概念中,它應該只打印2次。 難道無法幫助我嗎?任何人都可以解釋爲什麼這個fork執行打印8次我的文本?

的代碼:

#include <stdio.h> 
#include <stdlib.h> 
int main(void) { 
    pid_t x=0; 
    pid_t y=0; 
    x=fork(); 
    if(y>0) 
     fork(); 
    if(x==0) 
     y=fork(); 
    fork(); 
    if(y==0){ 
     fork(); 
     printf("Some text\n"); 
    } 
} 
+1

只有兩次,有很多叉路呼叫!你有沒有嘗試添加一些'printf'來跟蹤控制流? –

+1

這看起來像是一份給我的學校作業。這個問題的目的是什麼? – manishg

+0

是的,這是一個學校作業。我必須確定文本打印的次數。 –

回答

4

x = fork();執行和2個進程正在運行。

if (y>0) fork();將永遠不會執行。

if (x==0) y=fork();將由子進程執行,所以現在有3個進程正在運行。對於最初的父母y仍然是0。對於孩子,它是y == child_child's pid,孩子的孩子是y==0

所有3個進程將執行fork(),所以總共有6個進程,其中4個進程的內存中有y==0

這些4個進程再次叉,所以有8個流程和它們執行該printf(...);

+0

ok elikatsis,我不知道每個進程都有自己的帶有0值的變量y,這是混亂。謝謝。 –

+0

請記住,每個分支進程都會獲得父內存的副本,因爲它正好在執行fork之前! :-) – elikatsis

1

我修改代碼有更多的調試打印。

#include <stdio.h> 
#include <stdlib.h> 
#include "unistd.h" 
int main() { 
    pid_t x=0; 
    pid_t y=0; 

    printf("FORK X \n"); 
    x=fork(); 

    if(y>0) { 
     printf("FORK 1 \n"); 
     fork(); 
    } 

    if(x==0) { 
     printf("FORK 2 \n"); 
     y=fork(); 
    } 

    printf("FORK 3 \n"); 
    fork(); 
    if(y==0){ 
     printf("FORK 4 \n"); 
     fork(); 
     printf("Some text\n"); 
    } 
} 

這裏是輸出,和每一個 「撥叉4」 將導致兩個 「一些文本」 因爲有一個叉算賬:

煎餅:TMP greedy52 $ ./a.out

FORK X 
FORK 3 
FORK 4 
FORK 2 
FORK 4 
Some text 
Some text 
FORK 3 
FORK 3 
Some text 
Some text 
FORK 4 
Some text 
FORK 4 
Some text 
Some text 
Some text 

4 「FORK 4」 被達到(每次成功fork()調用創建兩個處理A和B):

  1. @ X =叉() - > x = 0和@FORK 3叉! A
  2. @ x = fork() - > x!= 0和@FORK 3 fork B
  3. @ x = fork() - > x = 0和@ y = fork() - > y = 0和@FORK 3叉甲
  4. @ X =叉() - > x = 0和@ Y =叉() - > Y = 0和@FORK 3叉乙

的@ X =叉() - > x = 0和@ y = fork() - > y!= 0分支不會生成任何「某些文本」。

FORK X --------> x != 0 -------------------------------> FORK 3 A -----> FORK 4 A (Some text) 
      |    |           |--> FORK 4 B (Some text) 
      |    | 
      |    |-----------------------------> FORK 3 B -----> FORK 4 A (Some text) 
      |               |--> FORK 4 B (Some text) 
      | 
      | 
      |----> x == 0 -----> FORK 2 A (y = 0) -----> FORK 3 A -----> FORK 4 A (Some text) 
         |           |--> FORK 4 B (Some text) 
         |       |---> FORK 3 B -----> FORK 4 A (Some text) 
         |           |--> FORK 4 B (Some text) 
         | 
         |---> FORK 2 B (y != 0) -----> FORK 3 A -----> XXX bad end 
                |---> FORK 3 B -----> XXX bad end 
+0

哇。這是有史以來最好的解釋。非常感謝。 –

相關問題