Un signal Unix est une notification délivrée par le noyau à un processus ou à l’un de ses threads pour signaler un événement : interruption clavier (SIGINT), demande de terminaison (SIGTERM), faute mémoire (SIGSEGV), écriture dans un tube fermé (SIGPIPE), etc. Selon sa disposition, il déclenche une action par défaut, est ignoré ou appelle un gestionnaire. SIGKILL et SIGSTOP ne peuvent toutefois être ni interceptés ni ignorés.

Un gestionnaire doit rester très simple, car il peut interrompre le programme presque n’importe où, notamment pendant qu’une bibliothèque modifie un état interne ou détient un verrou. Appeler une fonction non async-signal-safe comme printf() ou malloc() peut alors provoquer corruption, interblocage ou comportement indéfini.

En pratique, le gestionnaire doit généralement :

n’utiliser que des opérations async-signal-safe ;
sauvegarder puis restaurer errno s’il risque de le modifier ;
se limiter à affecter un indicateur de type volatile sig_atomic_t, ou à écrire dans un tube prévu à cet effet ;
laisser le traitement réel au flot normal du programme ;
tenir compte des appels système interrompus avec EINTR, même si SA_RESTART en redémarre certains.