8 bits de code de retour et les 8 bits du numéro de la mise à mort du signal sont mélangés dans une seule valeur sur le retour d' 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" */
}
Comment allez-vous déterminer le statut de sortie? Traditionnellement, la coque magasins à 8 bits de code de retour, mais définit le bit élevé si le processus a été arrêté anormalement.
$ sh -c 'sortie 42'; echo $?
42
$ sh -c 'kill-SEGV $$'; echo $?
Erreur de Segmentation
139
$ expr 139 - 128
11
Si vous voyez autre chose que cela, alors le programme a probablement un SIGSEGV
gestionnaire de signal qui appelle exit
normalement, donc il n'est pas réellement obtenir tué par le signal. (Programmes peuvent choisir de gérer tous les signaux hormis SIGKILL
et SIGSTOP
.)