2017-04-10 30 views
0
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main() 
{ 
    pid_t pid1, pid2, pid3, pid4; 
    pid1=fork(); 

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

你好, 以下代碼執行4次分支。起初,原始程序(讓我們稱之爲P0)執行「pid1 = fork()」並創建一個子程序(讓它稱爲P1)。然後原始進程再次執行pid2 = fork()並創建另一個子進程(我們稱之爲P2)。然後P2和P0執行「pid3 = fork()」。因此,P0創建了第三個孩子(稱爲P3),P2成爲父母並創建一個孩子(稱爲P4)。最後,在else語句中,第一個孩子(P1)創建一個孩子(P5)。因此,樹是這樣的:c程序中的多個fork()

    P0 
       P1 P2 P3 
      P5  P4 

我的問題是:我說的對不? 在此先感謝。

+2

使用調試器和/或添加一些調試'printf's和檢查自己 - 你會學到更多的方式。 –

+0

不是pid2 = fork();返回兩次(父母和子女),所以pid3 = fork90;將執行兩次。 –

+0

@DavidZimmerman是的,這就是提問說,爲什麼在他的樹形圖的數字上升到5 – JeremyP

回答

0

我的問題是:我說的對不?

是的。

正如保羅 - [R說,在評論,嘗試把一些的printf在例如後

pid1 = fork() 

嘗試把

printf("pid %d: pid1 = fork(), result = %d\n", getpid(), pid1); 

getpid()獲取當前進程的PID。

+1

使用'getppid()'可能是也有幫助。 –

0
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main() 
{ 
pid_t pid1, pid2, pid3, pid4; 
printf("PID=%d, PPID=%d.\n", getpid(), getppid()); 
pid1=fork(); 

if (pid1!=0) { 
pid2=fork(); 
printf("PID=%d, PPID=%d.\n", getpid(), getppid()); 
pid3=fork(); 
printf("PID=%d, PPID=%d.\n", getpid(), getppid()); 
}else { 
    pid4=fork(); 
    printf("PID=%d, PPID=%d.\n", getpid(), getppid()); } 
return 0; 
} 

我添加了一些printfs,我打印進程ID和父進程ID,但每個人都有相同的父母。是因爲原來的流程先完成?我得到this output

+0

確實他們是6個不同的過程,但他們的父母並不像我上面描述的 –