8 Bits des Rückgabecodes und 8 Bits der Nummer des Tötungssignals werden zu einem einzigen Wert bei der Rückkehr von wait(2)
& Co. .
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
int main() {
int status;
pid_t child = fork();
if (child <= 0)
exit(42);
waitpid(child, &status, 0);
if (WIFEXITED(status))
printf("first child exited with %u\n", WEXITSTATUS(status));
/* prints: "first child exited with 42" */
child = fork();
if (child <= 0)
kill(getpid(), SIGSEGV);
waitpid(child, &status, 0);
if (WIFSIGNALED(status))
printf("second child died with %u\n", WTERMSIG(status));
/* prints: "second child died with 11" */
}
Wie bestimmen Sie den Ausgangsstatus? Traditionell speichert die Shell nur einen 8-Bit-Rückgabecode, setzt aber das hohe Bit, wenn der Prozess abnormal beendet wurde.
$ sh -c 'exit 42'; echo $?
42
$ sh -c 'kill -SEGV $$'; echo $?
Segmentation fault
139
$ expr 139 - 128
11
Wenn Sie etwas anderes sehen, dann hat das Programm wahrscheinlich einen SIGSEGV
Signal-Handler, der dann aufruft exit
normal, so dass es nicht wirklich durch das Signal getötet wird. (Programme können wählen, ob sie mit anderen Signalen als SIGKILL
y SIGSTOP
.)