J'ai écrit le code suivant avec l'intention suivante: L'enfant envoie un signal SIGKILL au parent, puis le parent va le gérer en utilisant le gestionnaire. Le gestionnaire incrémente simplement le compteur.Pourquoi SIGKILL n'est pas géré par mon gestionnaire de signal et conduit parfois à la déconnexion du compte
int counter = 0;
void handler(int sig) {
counter++;
sleep(1); /* Do some work in the handler */
return;
}
int main() {
int i;
//signal(SIGUSR2, handler);
signal(SIGKILL, handler);
if (fork() == 0) { /* Child */
for (i = 0; i < 5; i++) {
//kill(getppid(), SIGUSR2);
kill(getppid(), SIGKILL);
printf("sent SIGKILL to parent %d\n", getppid());
}
exit(0);
}
wait(NULL);
printf("counter=%d\n", counter);
exit(0);
}
Cependant, le premier type de sortie que je reçois est:
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
Killed
Apparemment, le SIGKILL tue le processus parent. Pourquoi cela se produit-il puisque mon gestionnaire ne tue pas le parent?
Un autre événement non déterministe, mais à très forte probabilité (~ 50%) est celui sur ma machine 64 bits Ubuntu 14.04. Si j'exécute ce code, je vais me déconnecter automatiquement du compte. Pourquoi cela arriverait-il?