Ich möchte wissen, wann mein Kindprozess beendet wird. Aber ich möchte meine Anwendung nicht blockieren, also verwende ich WNOHANG.Falscher Status während der Verwendung von waitpid mit WHOHANG
#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;
}
Es funktioniert gut, wenn ich "okular" wie üblich schließen.
$ ./test
nsig=17; status=0
Exited
Aber wenn ich etwas tun, wie
kill -STOP OKULAR_PID
habe ich die gleiche Leistung und das ist falsch für mich, weil okular in der Tat nicht Ausfahrt tat.
Das ist nicht Ihr Problem, aber Sie sollten wissen, dass der Aufruf von 'printf' aus einem Signalhandler normalerweise zu undefiniertem Verhalten führt. –
Vielen Dank für die Warnung. – Ximik