Quand exactement le signal commencera-t-il à s’exécuter sous Unix Le signal sera-t-il traité quand le système passera en mode kernel? ou immédiatement quand il reçoit le signal? Je suppose qu’il sera traité immédiatement lorsqu’il recevra.
Un signal est le mécanisme Unix permettant à un processus d’espace utilisateur de recevoir des notifications asynchrones. En tant que tels, les signaux sont toujours “délivrés par” le kernel. Et par conséquent, il est impossible de transmettre un signal sans passer en mode kernel. Par conséquent, cela n’a pas de sens de parler d’un processus “recevant” un signal (ou en envoyant un) sans l’implication du kernel.
Les signaux peuvent être générés de différentes manières.
kill(2)
. SIGPIPE
peut être généré à la suite de l’écriture sur un canal sans lecteur. Mais dans tous les cas, le signal est transmis au processus de réception par le kernel et donc par une transition en mode kernel.
Le kernel peut avoir besoin de forcer cette transition – préempter le processus de réception – pour délivrer le signal (par exemple, dans le cas où un processus lié au processeur est exécuté sur un processeur A envoyé un signal par un processus différent en cours d’exécution) sur le processeur B).
Dans certains cas, le kernel peut gérer le signal lui-même (par exemple, avec SIGKILL
– ou plusieurs autres si aucun gestionnaire de signal n’est configuré).
Le fait d’appeler un gestionnaire de signal de processus se fait en manipulant la stack d’espace utilisateur du processus afin que le gestionnaire de signaux soit appelé en retour du mode kernel et que, si la procédure du gestionnaire de signaux revienne, le code d’origine puisse être repris.
Quant au traitement, il est soumis à plusieurs facteurs.
Un signal sera immédiatement détecté par le processus qui le reçoit. Selon le type de signal, le processus peut le traiter avec le gestionnaire par défaut, peut l’ignorer ou peut exécuter un gestionnaire personnalisé. Cela dépend beaucoup du processus et du signal qu’il reçoit. L’exception est le signal de suppression (9) qui est traité par le kernel et termine l’exécution du processus qui était censé le recevoir.