私の子プロセスが終了したときに知りたいことがあります。しかし私は自分のアプリケーションをブロックしたくないので、私は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は実際に出ていなかったので、私は同じ出力を持っており、それは私のために間違っているのです。
これは問題ではありませんが、シグナルハンドラから 'printf'を呼び出すと、通常は未定義の動作になることに注意してください。 –
ありがとうございます。 – Ximik