2017-06-04 1 views
0

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?

Répondre

0

Vous avez lu le manuel de signal()?

Première:

Le comportement du signal() varie selon les versions UNIX, et a aussi varié historiquement dans les différentes versions de Linux. Evitez son utilisation: utilisez plutôt sigaction (2). Voir Portabilité ci-dessous.

Deuxième:

Les signaux SIGKILL et SIGSTOP ne peut pas être interceptés ou ignorés.