2014-04-22 1 views
-1

나는 2 개의 평행 작업 포크를 만들고 끝내기를 기다린다.포크와 pid 체크 바깥의 아이들을 기다리는 것

for (int i = 0; i < 2; i++) { 
    pid_t pid = fork(); 

    if(pid < 0) { 
     fprintf(stderr,"Cannot fork!"); 
     exit(EXIT_FAILURE); 
    } 
    else if(pid == 0) { 
     switch(i) 
     { 
      case 0: 
       //first child 
       exit(EXIT_SUCCESS); 
       break; 
      case 1: 
       //second child 
       exit(EXIT_SUCCESS); 
       break; 
     } 
     break; 
    } 
    else { 
     //parent 
    } 
} 

문제는 주 프로그램이 하위 프로그램보다 먼저 종료된다는 것입니다. 다른 부모 파트에 대기 (0)를 추가하면 모든 프로세스가 대기하므로 동시에 하나씩 작동하지 않습니다. 루프 뒤에 wait() 또는 waitpid()를 넣을 수 있다고 가정했으나 작동하지 않습니다. 나는 포크 후 부모가 정상적으로 계속해서 wait()가 루프와 if-else 구조 외부에있을 때 왜 기다리지 않는지 생각했다.

죄송합니다. 미리 감사드립니다.

답변

1

else 부분에 wait(NULL)을 추가하면 부모 프로세스가 실제로 첫 번째 자식 프로세스가 반환되어 두 번째 자식 프로세스가 만들어 질 때까지 대기합니다.

루프 뒤에 wait(NULL)을 추가하면 부모 프로세스는 을 한 번만을 반환하고 반환 할 첫 번째 자식 프로세스를 대기합니다.

동시에 실행할 수있는 모든 어린이-프로세스가 원하는 경우

, 당신은 모든 자식 프로세스의 종료 상태를 수집하기 위해 필요에 따라 부모 프로세스가 wait() 많은 시간을 사용하는 두 번째 루프가 필요합니다.

귀하의 경우 2 개의 하위 프로세스가 있으므로 2 wait() 시스템 호출이면 충분합니다.

for (i = 0; i < 2; i++) { 
    wait(NULL); 
    printf("My child No %d died.\n", i); 
} 
+0

많은 감사를 : 이렇게 될 것입니다 추가 할 수있는 루프 (나는 또한 당신이 당신의 stdout에 그것을 관찰 할 수 있도록 printf 추가). 각 종료 상태를 기다리는 것을 몰랐습니다. 나는 이것이 어떻게 작동하는지 상상할 문제가있다. 대단히 감사합니다 :-) – Hitokage

관련 문제