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 '^\'
-
^? correspond au caractère DEL (ASCII 127)
-
^ est une notation (cf. Manipulation)
pour le caractère \ (ASCII 28)
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
- SIGINT
le signal d'interruption (2)
- SIGQUIT
le signal d'abandon (3)
- SIGKILL
le signal de meurtre (9)
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.