2013-12-15 6 views
0

하위 프로세스 3 개와 상위 프로세스 1 개가 있습니까? 두 개의 다른 waitpid는 무엇을합니까? 왜 그 중 두 개가 있습니까?waitpid와 함께 포크 사용

int main() 
{ 
    pid_t pid; 

    int status, counter = 4; 
    while(counter > 0) 
    { 
     pid = fork(); 
     if(pid) 
     { 
      counter /= 2; 
     } 
     else 
     { 
      printf("%d", counter); /* (1) */ 
      break; 
     } 
    } 
    if(pid) 
    { 
     waitpid(-1, &status, 0); 
     counter += WEXITSTATUS(status); 
     waitpid(-1, &status, 0); 
     counter += WEXITSTATUS(status); 
     printf(";%d", counter); /* (2) */ 
    } 
    return counter; 
} 

waitpid가 3, 5, 6, 34, 52, 61 (세미콜론 제외)을 인쇄 한 후 두 번째 printf입니다. 2 자리 숫자 인쇄 방법이 확실치 않습니다. 나는 두 번째 숫자가 아마도 while 루프에서 printf에서 오는 것임을 압니다.

+0

while 루프에서 'printf'앞에 접두어를 붙이면 어디서 시작되는지 알 수 있습니다. – Barmar

+1

일부 어린이도 포크를합니다. – egur

+2

@ guur 어떻게 그렇게? 'fork()'는 포크 다음에'counter> 0'을 요구하는 코드에서만 호출됩니다. 자식 ('pid == 0')은'fork()'를 수행하는 루프에서 빠져 나옵니다. – mah

답변

1

예, 하위 프로세스 3 개와 상위 1 개가 있습니다.

if(pid) 
{ 
    while (waitpid(-1, &status, 0) != -1) /* ignoring signals, errors */ 
    counter += WEXITSTATUS(status); 
} 
return counter; 

부모는이 경우 7을 반환 : 어린이 4, 2, 1

모든 상태를 수집하려면 반환, 당신은 while 루프를 사용할 수 있습니다.

당신이 그 때, 예를 들어 설정 {4,2,1}에서 모든 쌍을 반환 할 수 있습니다 두 waitpid() 전화를 사용하는 경우, {4,1} 또는 {2,1} 그래서 부모 인쇄 상응 ;5;3.

stdio 버퍼링 및 fork() 상호 작용으로 인해 출력이 증가 할 수 있습니다. fork() 전에 printf anomaly after “fork()”

어느 fflush()를 참조하거나 대신 어린이 write/_exit를 사용합니다.