2017-04-22 32 views
1

我想創造這個使用fork()和wait()的混淆,這也是最有效的方法嗎?

    P0 
       /\ 
       P1 P2 
        /| \ 
        P3 P4 P5 

使用fork() 這是我的代碼

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <wait.h> 

int main() 
{ 
    printf("P0 PID=%d, PPID=%d.\n", getpid(), getppid()); 
    int pid1, pid2, pid3, pid4, pid5; 
    pid1 = fork(); 
    int status = 0; 
    if(pid1 != 0){ 
    pid2 = fork(); 
    if(pid2 != 0){ 
     waitpid(pid2, &status, 0); //If father, wait for child P2 
     printf("%d\n", status); 
    } 
    else{ 
     printf("P2 PID=%d, PPID=%d.\n", getpid(), getppid()); 
     pid3 = fork(); 
     if(pid3 != 0){ //If father (P2 at this point) 
     waitpid(pid3, &status, 0); //Wait for child (P3) 
     pid4 = fork(); 
     if(pid4 != 0){ 
      waitpid(pid4, &status, 0); 
      pid5 = fork(); 
      if(pid5 == 0){ 
      printf("P5 PID=%d, PPID=%d.\n", getpid(), getppid()); 
      } 
     } 
     else{ 
      printf("P4 PID=%d, PPID=%d.\n", getpid(), getppid()); 
     } 
     } 
     else{ 
     printf("P3 PID=%d, PPID=%d.\n", getpid(), getppid()); 
     } 
    } 
    } 
    else{ 
    printf("P1 PID=%d, PPID=%d.\n", getpid(), getppid()); 
    } 
    return 0; 
} 

我的目標是使第一個過程等待,直到我P2過程中確實需要的一切,然後繼續。 此行printf("%d\n", status);用於查看P0(父級)進程何時繼續,但每次都打印在不同的位置。我很困擾。我做對了嗎? 此外,這是創建上述內容的最有效方法嗎? 謝謝

UPDATE

我改變了一些東西在我的代碼(見註釋),我現在使用waitpid。我認爲這是正確的。我等待P2結束,P2等待P3,P4結束。 This is the output

回答

0

waitman page,(重點煤礦)

的等待()系統調用掛起調用進程的執行,直到它的孩子終止的之一。

對於您的情況,在每次執行時,P0的孩子完成其執行的順序可能不同。一旦任何一個孩子完成執行,P0停止等待並恢復。即使如此,P0執行其printf()語句的順序與仍在執行的任何子進程相比可能在每次執行時仍然不同。因此,它每次出現在不同的地方。

如果您想要等待所有孩子完成執行,那麼您需要撥打wait多少次兒童。在你的情況下,你可以撥打waitP2三次,並在P0兩次這樣做。

+0

謝謝你的時間和你的答案。我會嘗試。作爲@ Dinos_12345建議使用'waitpid',是否有更好的解決方案? –

+0

'waitpid'給你更多的控制,你可以指定一個特定的進程等待等。在手冊頁中,您可以看到'wait'等同於'waitpid(-1,&status,0)'。使用哪個可能取決於你使用的是什麼。 – GoodDeeds

相關問題