Précédent Index Suivant

5.11   Signalisation

Deux autres caractères utiles existent qui ont des effets dépassant de loin l'interface, ce sont les caractères d'interruption (intr pour INTeRupt) et d'abandon (quit). Ils se programment de façon classique
 stty intr '^?' 

 stty quit '^\
Les tâches peuvent communiquer entre elles par fichiers, par cascades mais aussi par signaux. Les deux premières façons permettent d'échanger des messages composés d'un nombre quelconque d'octets. Il est souvent nécessaire d'alerter une tâche sans pour cela lui fournir pléthore d'informations. De plus, deux tâches peuvent vouloir échanger des signaux sans pour cela ouvrir un fichier commun (solution lourde et coûteuse) ni mettre en oeuvre une cascade ce qui ne se peut (sous UNIX V7) qu'entre tâches issues d'un même ancêtre ayant ouvert cette fameuse cascade ! La solution réside dans l'envoi de signaux entre tâches qui n'ont alors besoin de connaitre que leur numéro. Le signal peut être affublé d'une sémantique quelconque laissée à l'initiative des interlocuteurs.

Quelques dizaines de signaux standard existent. Les plus courants sont Un signal peut être envoyé à n'importe quelle tâche. chaque tâche est référencée par un numéro (entre 1 et par exemple, 32767). La tâche 1 est la tâche init lancée, comme son nom l'indique, à l'initialisation du système. A chaque création de tâche ce numéro est incrémenté. La commande kill permet d'envoyer un signal. Ainsi
kill -2 $$ 
émet le signal d'interruption à votre interprète de commandes courant (peut lui en chaud d'ailleurs car il sait les ignorer). $$ est une variable prédéfinie dont la valeur est le numéro de la tâche qui interprète la commande.

Un signal peut aussi être envoyé à toutes les tâches, encore vivantes, issues de votre login initial. On utilise pour ce faire le numéro zéro. La commande
 kill -9 0 
tue sûrement toutes ces tâches ainsi que votre sh initial. Init voyant alors que votre terminal est ésseulé, le réinitialise en recréant un nouveau login qui vous permettra de continuer votre travail après avoir exorcisé vos démons antérieurs. Le signal de meurtre ne peut être ignoré et est donc toujours couronné de succès.

Le signal d'interruption tue en général la (ou les) tâche(s) qui le reçoit(vent). le signal d'abandon aussi, mais il force en outre un vidage mémoire de la tâche dans un fichier de nom core qui peut être inspecté par adb. La plupart des programmes interactifs bien au point rattrappent le signal d'interruption et se réinitialisent au niveau de leur boucle principale de commandes (par exemple, Le_Lisp, adb, more ...). Le signal d'abandon est en général laissé pour vraiment tuer ces tâches. Frapper DEL force l'interface à émettre
 kill -2 0 
tandis que ­\ provoque
 kill -3 0 
Ces actions, locales à l'interface, sont déclenchées dès que reçues et donc de façon totalement déconnectées et asynchrones des éventuelles lectures que pourraient commettre vos tâches courantes. C'est donc un moyen efficace de se signaler à l'attention d'UNIX. La touche DEL est souvent nommée sur les claviers ATTN ou ATTENTION.


Précédent Index Suivant