2017-02-22 4 views
0

* 표시 괜찬아 대기()와 wait_pid는() 데모 프로그램에서 작동 곳리눅스에서 여러 자식 프로세스를 대기하는 방법?

(1) 아버지 포크 아이,

(2) 및 대기 함수가 반환을 종료하는 아이 기다립니다 .

아버지가 기다리지 않고 계속 달리면 아이들은 퇴장하고 "좀비"가됩니다.

그러나 현실 세계 * nix에서 스크립트 프로그래밍은

같은

(1) 내가 서버 프로그램을 작성하고,

(2) 주요 프로세스가 어떤 자식 근로자를 포크로 작동 ,

(3) 이러한 아동 근로자는 일을하고 나서 퇴직한다.

그런데 아버지는 여러 분의 아이들을 어떻게 처리합니까? 이 작업을 수행하는 편리한 방법이 있습니까? 아니면 디자인이 달라야합니까?

감사합니다.

+0

당신이 읽게을 'man wait' /'man waitpid'? –

+0

아버지는 자녀를 기다릴 필요가 없습니다. SIGCHILD를 잡는 시그널 핸들러를 간단히 가질 수 있고 핸들러는 필요한 액션을 취할 수있다. – codeforester

답변

1

세 가지 가능성 :

1) 주기적으로 waitpid를 죽은 아이들을 확인합니다. 즉 지금 다시 수행

while (waitpid(-1, NULL, WNOHANG) > 0) 
     continue; 

2) 정리를 신호 처리기에서

/* SIGCHLD handler to reap dead child processes */ 
static void grimReaper(int sig) 
{ 
    int savedErrno = errno; 
    while (waitpid(-1, NULL, WNOHANG) > 0) 
     continue; 
    errno = savedErrno; 
} 
int main(void) { 
    ... 
    struct sigaction sa; 
    memset(&sa, 0, sizeof sa); 
    sigemptyset(&sa.sa_mask); 
    sa.sa_handler = grimReaper; 
    if (sigaction(SIGCHLD, &sa, NULL) == -1) 
     ... 
}  

3) 만들기 분리 된 아동 부모의 SIGCHLD 무시 :

signal(SIGCHLD, SIG_IGN); 
+0

후자는 당신이 제안하는 시나리오에서 인기가 있습니다. – ttyridal

관련 문제