Pour répondre à cette question, vous devez comprendre comment les signaux sont envoyés à un processus et comment un processus existe dans le noyau.
Chaque processus est représenté comme un task_structà l'intérieur du noyau (la définition est dans le sched.hfichier d' en- tête et commence ici ). Cette structure contient des informations sur le processus; par exemple le pid. Les informations importantes se trouvent sur la ligne 1566 où le signal associé est stocké. Ce paramètre n'est défini que si un signal est envoyé au processus.
Un processus mort ou un processus zombie a toujours un task_struct. La structure reste, jusqu'à ce que le processus parent (naturel ou par adoption) ait appelé wait()après la réception SIGCHLDpour récolter son processus enfant. Lorsqu'un signal est envoyé, le signal_structest réglé. Peu importe que le signal soit capturable ou non, dans ce cas.
Les signaux sont évalués à chaque fois que le processus s'exécute. Ou pour être exact, avant que le processus ne s'exécute. Le processus est alors en l' TASK_RUNNINGétat. Le noyau exécute la schedule()routine qui détermine le processus suivant en fonction de son algorithme de planification. En supposant que ce processus est le prochain processus en cours, la valeur de signal_structest évaluée, qu'il y ait ou non un signal en attente à traiter. Si un gestionnaire de signal est défini manuellement (via signal()ou sigaction()), la fonction enregistrée est exécutée, sinon l' action par défaut du signal est exécutée. L'action par défaut dépend du signal envoyé.
Par exemple, le SIGSTOPgestionnaire par défaut du signal changera l'état du processus actuel en TASK_STOPPEDpuis s'exécutera schedule()pour sélectionner un nouveau processus à exécuter. Remarquez, SIGSTOPn'est pas capturable (comme SIGKILL), donc il n'y a aucune possibilité d'enregistrer un gestionnaire de signal manuel. En cas de signal inaccessible, l'action par défaut sera toujours exécutée.
À votre question:
Un processus défunt ou mort ne sera jamais déterminé par l'ordonnanceur comme étant à TASK_RUNNINGnouveau dans l' état. Ainsi, le noyau n'exécutera jamais le gestionnaire de signal (par défaut ou défini) pour le signal correspondant, quel que soit le signal. Par conséquent, le exit_signalne sera plus jamais réglé. Le signal est « livré » au processus en définissant le signal_structdans task_structdu processus, mais rien d' autre qui va se passer, parce que le processus ne fonctionnera jamais à nouveau. Il n'y a pas de code à exécuter, tout ce qui reste du processus est cette structure de processus.
Cependant, si le processus parent recueille ses enfants wait(), le code de sortie qu'il reçoit est celui lorsque le processus est "initialement" mort. Peu importe s'il y a un signal en attente de traitement.
               
              
killelle-même renvoie-t-elle 0 ou 1?