2010-11-22 8 views
0

. 그러나 나는 나의 신청을 막고 싶지 않아, 그래서 나는 WNOHANG을 사용한다.WHOHANG으로 waitpid를 사용하는 동안 상태가 잘못되었습니다. 내 자식 프로세스가 종료 될 때 알고 싶습니다.

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

void handler(int nsig) { 
    int status; 
    waitpid(-1, &status, WNOHANG); 
    printf("nsig=%i; status=%i\n", nsig, status); 
    if (WIFEXITED(status)) { 
    printf("Exited\n"); 
    } 
} 

int main() { 
    struct sigaction act; 
    act.sa_handler = handler; 
    if (sigaction(SIGCHLD, &act, 0) < 0) { 
    fprintf(stderr, "sigaction failed\n"); 
    exit(-1); 
    } 

    pid_t fpid; 
    fpid = fork(); 
    if (fpid == 0) { 
    execlp("okular", "okular", 0); 
    } 
    while(1); 
    return 0; 
} 

평소와 같이 "okular"를 닫으면 정상적으로 작동합니다. 내가

kill -STOP OKULAR_PID 

같은 것을 할 경우

$ ./test 
nsig=17; status=0 
Exited 

는하지만 동일한 출력을 가지고 Okular의 사실에 출구를하지 않았기 때문에 즉, 나에게 잘못입니다.

+0

이것은 문제가 아니지만 신호 처리기에서'printf'를 호출하면 일반적으로 정의되지 않은 동작이 발생합니다. –

+0

경고 해 주셔서 감사합니다. – Ximik

답변

1

SIGCHLD가 신호로 인해이 man page에서 볼 수있는 것처럼 종료되거나 중단 된 자식으로 정의 되었기 때문에 나는 그것이 옳다고 생각합니다. SIGCLD는 SIGCHLD의 동의어입니다.

+0

그런데 WIFEXITED가 작동하는 이유는 무엇입니까? – Ximik

+3

@Ximik :'waitpid()'가'> 0' 값을 반환 한 경우에만'status'를 검사해야합니다. – caf

+0

고마워요. 이것이 해결책입니다. – Ximik

관련 문제