2017-11-22 1 views
1

C에서 return 값인 wait을 확인한 후 오류가 아니면 WIFEXITEDWIFEXITSTATUS이라는 또 다른 검사가 있습니다. 왜 이렇게 중복되지 않습니까? 내가 이해하는 한, wait은 오류가 발생하면 -1을 반환하고, 은자식이 정상적으로 종료되면 0이 아닌 값을 반환합니다. 그래서이 라인에 아무런 오류가 없다면 if (wait(&status) < 0) 무엇이 잘못되었을 것입니까? WIFEXITED 확인 하시겠습니까? 리눅스 시스템 호출에서 자식 프로세스를 죽이기 위해 기다린 후에 WIFEXITED를 확인해야하는 이유는 무엇입니까?

코드입니다 :

#include <stdio.h> 
#include <signal.h> 
#include <sys/wait.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define CHILDREN_NUM 5 

int main() { 

    int i, status, pid, p; 
    for(i = 0; ((pid = fork()) < 0) && i < CHILDREN_NUM;i++) 
     sleep(5); 


    if (pid == 0) 
    { 
     printf(" Child %d : successfully created!\n",i); 
     exit(0); /* Son normally exits here! */ 
    } 

    p = CHILDREN_NUM; 
    /* The father waits for agents to return succesfully */ 
    while (p >= 1) 
    { 
     if (wait(&status) < 0) { 
      perror("Error"); 
      exit(1); 
     } 

     if (! (WIFEXITED(status) && (WEXITSTATUS(status) == 0))) /* kill all running agents */ 
     { 
      fprintf(stderr,"Child failed. Killing all running children.\n"); 
      //some code to kill children here 
      exit(1); 
     } 
     p--; 
    } 

    return(0); 
} 

답변

2

wait>= 0를 반환하는 것은 당신 자식 프로세스가 종료 (그리고 wait를 호출하면 실패하지 않았다에게) 이야기하지만, 그 프로세스가 성공적 여부 종료 여부를 알려하지 않습니다 (또는 신호가있는 경우).

그러나, 여기, 당신의 코드를 찾고,이 프로그램이 종료 된 자식 프로세스가 너무 성공적하거나하지 않았다 여부에 관심 않습니다 상당히 분명하다 :

fprintf(stderr,"Child failed. Killing all running children.\n");

그래서, 프로그램

  • : wait 채워 된 status 구조에 더 테스트를 할 필요가: 프로세스가 정상적으로 종료 되었습니까? (신호로 보내지는 것과는 대조적으로).
  • WEXITSTATUS(status) == 0 : 프로세스를 종료 코드 0 (일명 "성공")으로 종료 했습니까? 자세한 내용은 Meaning of exit status 1 returned by linux command을 참조하십시오.
1

wait(&status)은 하위 프로세스가 종료 될 때까지 대기합니다. 해지는 자발적인 출구로 인한 것이거나 처리되지 않은 신호의 수령으로 인한 것일 수 있습니다.

WIFEXITED(status)WIFSIGNALED(status)는 두 *의 경우를 구별 할 수 있도록하고, 나중에 WEXITSTATUS 또는 WTERMSIG 중 하나가 종료 상태 (if(WIFEXITED(status)) 또는 종료 신호 (if(WIFSIGNALED(status)) 중 하나를 검색하는 데 사용할 수 있습니다. 자식 프로세스가 중지하고 (전용 리눅스) 각각 WIFSTOPPED 또는 WIFCONTINUED으로 검색 할 수 있습니다 재개되어야에 waitpid 및 특수 플래그 (WUNTRACED, WCONTINUED)와


* , 당신은 기다릴 수 있습니다. 자세한 내용은 waitpid(2)을 참조하십시오.

관련 문제