# Signal (informatique)

En informatique, un signal est une forme de communication entre processus utilisée par les systèmes de type Unix et ceux respectant les standards POSIX. Il s'agit d'une notification asynchrone envoyée à un processus pour lui signaler l'apparition d'un événement. Quand un signal est envoyé à un processus, le système d'exploitation interrompt l'exécution normale de celui-ci. Si le processus possède une routine de traitement pour le signal reçu, il lance son exécution. Dans le cas contraire, il exécute la routine de traitement des signaux par défaut.
La norme POSIX (et la documentation de Linux) limite les fonctions directement ou indirectement appelables depuis cette routine de traitements des signaux. Par exemple malloc ou printf ne peuvent y être utilisés (à cause d'une possible interférence avec l'état global du programme). Plus précisément, cette norme donne une liste exhaustive de fonctions primitives dites async-signal safe (en pratique, les appels systèmes) qui sont les seules à pouvoir être appelées depuis une routine de traitement de signal sans avoir un comportement indéfini. Il est donc suggéré d'avoir une routine de traitement de signal qui positionne simplement un drapeau déclaré volatile sig_atomic_t qui serait testé ailleurs dans le programme.

## Historique

La version 1 d'Unix avait des appels systèmes pour capturer les interruptions, les exceptions matérielles et l'arrêt du système. La version 4 regroupe toutes ces notions en une seule: signal. Toutes les exceptions matérielles numérotées reçoivent un nom dans la version 7.
kill apparaît dans la version 2 et peut envoyer des signaux arbitraire à partir de la version 5.

## Envoyer des signaux

L'appel système kill(2) permet d'envoyer, si cela est permis, un signal à un processus. La commande kill(1) utilise cet appel système pour faire de même depuis le shell. la fonction raise(3) permet d'envoyer un signal au processus courant.
Les exceptions comme les erreurs de segmentation ou les division par zéro génèrent des signaux. Ici les signaux générés seront respectivement SIGSEGV et SIGFPE. Un processus recevant ces signaux se terminera et générera un core dump par défaut.
Le noyau peut générer des signaux pour notifier les processus que quelque chose s'est passé. Par exemple, SIGPIPE est envoyé à un processus qui essaye d'écrire dans un pipe qui a été fermé par celui qui lit. Par défaut, le programme se termine alors. Ce comportement rend la construction de pipeline en shell aisée.

## Liste des signaux

Ces signaux sont apparus dans le standard POSIX.1-1990. Les signaux peuvent varier d'un système à un autre, ils sont définis dans le fichier d'entête du système, <signal.h>. SIGKILL et SIGSTOP ne peuvent pas être interceptés par le processus.
| ID | Nom | Description | Action par défaut |
| 1 | SIGHUP | Rupture détectée sur le terminal contrôleur ou mort du processus parent | Terminer le processus |
| 2 | SIGINT | Interruption du clavier (Ctrl+C dans un terminal) | Terminer le processus |
| 3 | SIGQUIT | Arrêt du processus | Terminer le processus et faire un dump core |
| 4 | SIGILL | Instruction illégale | Terminer le processus et faire un dump core |
| 6 | SIGABRT | Arrêt anormal du processus | Terminer le processus et faire un dump core |
| 8 | SIGFPE | Erreur sur un nombre flottant | Terminer le processus et faire un dump core |
| 9 | SIGKILL | Tue immédiatement le processus | Terminer le processus |
| 11 | SIGSEGV | Erreur de segmentation | Terminer le processus et faire un dump core |
| 13 | SIGPIPE | Erreur de tube (écriture dans un tube sans lecteur) | Terminer le processus |
| 14 | SIGALRM | Signal du timer définit par alarm(2) | Terminer le processus |
| 15 | SIGTERM | Termine le processus | Terminer le processus |
| 16, 10, 30 | SIGUSR1 | Signaux utilisateurs, l'action est spécifique au processus | Terminer le processus |
| 17, 12, 31 | SIGUSR2 | Signaux utilisateurs, l'action est spécifique au processus | Terminer le processus |
| 18, 20, 17 | SIGCHLD | Processus enfant terminé ou stoppé | Rien |
| 19, 18, 25 | SIGSTOP | Interromps immédiatement le processus | Stoppe le processus |
| 20, 18, 24 | SIGTSTP | Interromps le processus (Ctrl+Z dans un terminal) | Stoppe le processus |
| 21, 26 | SIGTTIN | Entrée de terminal pour un processus en arrière plan | Stoppe le processus |
| 22, 27 | SIGTTOU | Sortie de terminal pour un processus en arrière plan | Stoppe le processus |
| | SIGVTALRM | chronomètre virtuel (Virtual Timer) expiré | |
| | SIGXCPU | Le processus a dépassé une certaine limite d'utilisation du processus définit par l'utilisateur. Le processus doit alors sauvegarder les données temporairement obtenues et quitter proprement avant une interception par le signal SIGKILL. | |
| | SIGXFSZ | Le script a fait grossir un fichier au-delà d'une limite définie | |
| | SIGWINCH | la taille du terminal contrôlant le processus a changé | |