2010-11-22 26 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" 閉じる場合は正常に動作します。

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

しかし、私は

kill -STOP OKULAR_PID 

ような何かを行う場合okularは実際に出ていなかったので、私は同じ出力を持っており、それは私のために間違っているのです。

+0

これは問題ではありませんが、シグナルハンドラから 'printf'を呼び出すと、通常は未定義の動作になることに注意してください。 –

+0

ありがとうございます。 – Ximik

答えて

1

SIGCHLDはシグナルのためにこのman pageに見られるように、子が終了または停止したと定義されているので、そうだと思います。 SIGCLDはSIGCHLDの同義語です。

+0

しかし、WIFEXITEDがなぜ機能するのですか? – Ximik

+3

@ Ximik: 'waitpid()'が '> 0'を返した場合にのみ、' status'を調べるべきです。 – caf

+0

ありがとうございます。これが解決策です。 – Ximik

関連する問題