Articles récents
Linux/Unix : Les signaux entre processus
Un signal Unix est une information qui est envoyé à un processus. Ensuite, le processus interprète le code transmis et agit en conséquence. Le signal est envoyé à un autre processus (ou à lui même), c'est une technique pour dialoguer entre le père et le fils.
C'est un mécanisme très puissant qui n'est pas assez utilisé au vu de ce qu'il permet de faire.
1) Généralités
Un signal est transmis d'un processus à un autre, et le récepteur avise sur l'action à entreprendre. Il peut ne pas prendre en compte le signal, le capturer vers le gestionnaire de signal ou laisser le système traiter le signal avec le comportement usuel.Le Système dispose de NSIG signaux numérotés de 1 à NSIG. On retrouve les signaux connus par le système sous /usr/include/signal.h ou /usr/include/asm/signal.h . A noter que la plupart des signaux sont transmis par le noyau et que certains signaux traitent des problématiques de temps réels définis par Posix.
Les premiers signaux de la liste sont les signaux dits classiques (non temps réels), ensuite SIGRTMIN et SIGRTMAX encadre les signaux temps réels lorsqu'ils sont implémentés. Attention, les valeurs des signaux peuvent changer d'une distribution à une autre, aussi il très vivement conseillé de travailler avec les codes plutôt qu'avec les valeurs.
Voici un exemple de contenu du fichier signal.h
Voyons la signification des différents signaux:
2) Envoi et réception des signaux
Un signal dit pendant est envoyé par un processus ou le noyau. Le signal est dit délivré lorsque le processus réalise l'action:On peut également masquer ou bloquer un signal.
2.1) Envoi d'un signal
On utilise la fonction kill() pour envoyer un signal à un processus (en fait ne le tue pas nécessairement), tel que:int kill(pid_t pid, int numsignal);
Il est à noter que la commande kill -l liste les différents signaux du système, ils peuvent différer d'une distribution à une autre c'est pourquoi il est vivement conseillé de coder avec nom des signaux pour avoir un code portable. La commande kill du bash est kill -code num_process.
Si kill(0) est différent de -1, c'est que le signal est encore vivant, cela permet de tester l'existence d'un signal.
Un exemple d'utilisation:
Par défaut, la fonction kill() termine un processus, donc la commande kill(pid,SIGUSR1); termine le processus fils.
2.2) Le masquage des signaux
Il est possible de bloquer des signaux (sauf SIGKILL et SIGSTOP) par l’intermédiaire d'un masque mis en place par la fonction sigprocmask():nouveau est le nouveau masque et ancien celui d'avant. Le type sigset_t est le type des signaux. S'il n'y a pas de masque ancien à reprendre alors le troisième paramètre est à NULL. Le paramètre opt définit l'action à réaliser en utilisant les constantes prédéfinies:
2.2) Les fonctions relatives aux signaux
Le C système pour unix propose des des fonctions permettant de manipuler les signauxNous allons créer un set de signaux masqués et voir comment afficher les signaux reçus:
On constate que les signaux transmis comme CTRL + s'affichent par leurs numéros. On également envoyer un kill -3 numPID.
2.3) RĂ©ception des signaux
Pour capter un signal, on utilise la fonction sigaction() et la structure associée.La fonction retourne 0 en cas de réussite et -1 sinon. Le premier paramètre est le signal, le second symbolise la structure sigaction et le dernier une structure sur l'ancien comportement (permet de le remettre une fois terminé). Pour la structure sigaction, le sa_handler peut prendre les valeurs:
Enfin, sa_mask indique le set de signaux concernés par l'action et sa_flags qui est un OU binaire des différentes constantes permettant de gérer le comportement du gestionnaire de signal.
Vous trouverez ci-dessous un exemple de code qui détourne le comportement normal du signal SIGQUIT et SIGINT:
Ce qui donne en faisant un CTRL+C:
2.3) Attente d'un signal
La fonction sigsuspend() réalise le masquage des signaux pointé par ens et la mise en sommeil jusqu'à l'arrivée d'un signal non-masqué ce qui provoque la mort du processus ou l'exécution du handler mis pour ce signal.
3) Les signaux temps-réel
Les signaux temps réels sont implémentés avec la norme POSIX. A la différence des autres signaux, ils n'ont pas de signification particulière. Les signaux temps-réel sont compris entre SIGRTMIN et SIGRTMAX, attention le noyau ou d'autres applications peuvent utiliser les premiers signaux disponibles.Les caractéristiques des signaux temps réels:
Pour transmettre des données avec le signal, il est nécessaire d'activer le flag SA_SIGINFO dans la structure sigaction et d'utiliser la fonction :
PlutĂ´t qu'un long discours, voici un exemple qui reprend tout ce que nous avons vu:
Conclusion
Les signaux représentent un des moyens de discuter entre les différents processus, et nous avons vu qu'il est possible de transmettre des données, de tuer un processus ou encore de faire milles choses...
© 2024 www.doritique.fr par Robert DORIGNY