2017-04-22 6 views
1

내가 만들려고하고이fork()와 wait()를 사용하는 혼란이 또한 가장 효율적인 방법입니까?

    P0 
       /\ 
       P1 P2 
        /| \ 
        P3 P4 P5 

fork() 사용이 내 내 P2 프로세스가 필요한 모든 작업을 수행 할 때까지

#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; 
} 

내 목표는 최초 공정 대기를 만드는 것입니다 코드 및입니다 계속 진행하십시오. 이 줄은 P0 (부모) 프로세스가 계속 될 때 표시되지만 매번 다른 위치에 인쇄됩니다. 나 엄청 혼란스러워. 이 일을 제대로하고 있습니까? 또한 위에서 설명한 내용을 만드는 데 가장 효율적인 방법입니까? 은 (주석을 참조)

UPDATE 내 코드에서 몇 가지 변경 감사 지금 waitpid를 사용합니다. 나는 이것이 정확하다고 생각한다. 나는 P2가 끝나기를 기다리고 P2는 P3, P4가 끝날 때까지 기다린다. waitman page에서 This is the output

답변