Aussi disponible en : English · Español · Português · العربية
Numéros de signaux Linux
Le numéro de chaque signal sur cinq plateformes, la recherche inverse pour un numéro isolé, et la raison pour laquelle les numéros divergent.
Que sont les numéros de signaux ?
Un signal est la façon dont un système Unix interrompt un processus en cours : pour lui demander de s’arrêter, pour lui apprendre qu’un enfant s’est terminé, pour lui signaler qu’il a touché une zone mémoire interdite. Chacun a un nom comme SIGTERM et un petit entier, et kill en envoie un par l’un ou par l’autre. Les noms sont fixés par POSIX. Les numéros, non.
Toute la difficulté est là. POSIX normalise quels signaux existent et ce qu’ils signifient, et laisse la numérotation à l’implémentation — d’où un tableau à cinq colonnes, une par plateforme, avec bon nombre de lignes où elles divergent.
Cette page réunit les 39 signaux du manuel Linux et de l’en-tête d’Apple, avec le numéro que chaque plateforme leur attribue, leur statut POSIX, et l’action par défaut si vous ne les traitez pas. Au-dessus du tableau se trouve la commande qui compte le plus : tapez un numéro isolé et elle vous dit ce qu’il désigne partout.
Comment s’en servir
- Commencez par le numéro, si c’est ce que vous avez. Saisissez-le dans la recherche inverse : vous obtenez le signal qu’il désigne sur chaque plateforme, et un avertissement si elles divergent. C’est le sens dans lequel vous laissent une ligne de journal ou un code de sortie.
- Cherchez par nom, par numéro ou par description. SIGKILL, kill, 9 et pipe fonctionnent tous, et le nom exact arrive en tête plutôt que d’être enseveli sous tout ce qui contient simplement ces lettres.
- Lisez la ligne entière. L’action par défaut vous dit ce qui se passe si votre programme ignore le signal, et « n’existe pas » signifie que le signal est absent de cette plateforme — ce qui n’est pas la même chose qu’y porter un autre numéro.
Pourquoi les numéros divergent, et pourquoi ce n’est pas au hasard
L’exemple célèbre est SIGUSR1. Il vaut 10 sur x86 et ARM, 30 sur Alpha et SPARC, et 16 sur MIPS et PA-RISC — trois numéros pour un seul nom, et tous sous Linux. La divergence n’est pas entre systèmes d’exploitation, mais entre architectures d’un même système.
Formulé ainsi, cela ressemble à un désagrément. Formulé à l’envers, c’est un danger : le même numéro désigne des signaux différents. Dix, c’est SIGUSR1 sur x86 et SIGBUS presque partout ailleurs ; un script ou un bout de code qui écrit 10 en dur n’échoue donc pas bruyamment lorsqu’il tourne là où on ne l’attendait pas. Il envoie une erreur de bus à un processus qui attendait un signal utilisateur, et le processus meurt d’une manière pour laquelle personne n’a écrit de gestionnaire.
Ce qui rassure, c’est que le désaccord a une forme. Sur les 31 signaux que définissent à la fois le manuel Linux et l’en-tête d’Apple, macOS s’accorde avec la colonne Alpha et SPARC sur la totalité, et avec x86 sur 19 seulement. macOS et ces architectures descendent de BSD ; Linux sur x86 a repris la numérotation de System V. Il y a donc en réalité deux familles, et une colonne du tableau Linux est la colonne BSD sous une autre étiquette.
Une poignée de numéros est identique partout, et c’est pourquoi ce sont ceux que l’on retient : 1 est toujours SIGHUP, 2 toujours SIGINT, 9 toujours SIGKILL, 15 toujours SIGTERM. Ces quatre-là peuvent s’écrire en dur sans crainte. Presque aucun autre.
Limites honnêtes
Cinq plateformes ne sont pas toutes les plateformes. Le manuel Linux documente quatre regroupements d’architectures et Apple documente macOS ; les autres BSD, Solaris, AIX et le reste ont leurs propres en-têtes et ne figurent pas ici. Puisque tout l’intérêt de la page est que les numéros varient, traitez une absence comme « inconnu » et non comme « identique » : la conclusion sûre de ce tableau est toujours d’employer le nom.
Le tableau s’arrête aussi avant les signaux temps réel. Ils vont de SIGRTMIN à SIGRTMAX, n’ont pas de noms individuels, et SIGRTMIN lui-même n’est pas une constante : la bibliothèque C se réserve certains des plus bas, si bien que la valeur change d’un système à l’autre et même d’une version de bibliothèque à l’autre. Un numéro de cette plage ne se cherche dans aucun tableau, ce qui est une version renforcée du même avertissement.
Enfin, les numéros de signaux ne sont pas des codes de sortie, même s’ils se rencontrent. Un shell rapporte un processus tué par le signal N sous forme du code de sortie 128 plus N : un code 137 signifie donc le signal 9 sur une plateforme où 9 vaut SIGKILL. Cette arithmétique est une convention du shell et non une partie du signal, et elle hérite du même problème de portabilité.
Les données sont lues dans le manuel signal(7) de Linux et dans l’en-tête xnu d’Apple plutôt que dans un autre tableau, et la date de relevé est imprimée sous la liste.
Pourquoi est-ce gratuit ?
Parce que cela ne coûte rien à faire tourner. Le tableau fait partie de la page et la recherche a lieu dans votre navigateur ; rien n’est envoyé et aucun serveur ne voit ce que vous avez cherché.
Le script qui lit les deux sources est conservé à côté des données qu’il produit, et les tests vérifient nommément les numéros ainsi que la mesure de l’arbre généalogique : une mauvaise ligne casse la compilation au lieu d’atteindre la page.