Я хочу знать, когда мой дочерний процесс завершается.Но я не хочу блокировать свое приложение, поэтому я использую WNOHANG.
#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
У меня такой же вывод, и это неправильно для меня, потому что на самом деле окуляр не выходил.