Il existe environ 32 signaux prédéfinis, ayant chacun une signification. Il n'est pas possible de définir de nouveaux signaux. Les signaux sont envoyés soit par le système lui même (en particulier lorsque le processus tente une opération illégale comme une division par zéro ou un accès à une zone mémoire ne lui appartenant pas), soit par un autre processus appartenant au même utilisateur.
Certains signaux, comme le numéro 9, entraînent toujours la mort du
processus qui les reçoit. Pour d'autres au contraire7.1, le processus
peut spécifier une fonction traitante ( handler) qui sera
automatiquement appelée par le système lors de la réception d'un signal
particulier (voir l'appel système signal() plus loin).
Depuis le shell, on peut envoyer un signal à un processus en utilisant la
commande kill (voir page
). Son usage le plus
courant est sans doute de provoquer la fin d'un processus (le tuer),
grâce au signal 9.
int kill( int pid, int signum )qui envoie le signal de numéro
signum au processus de PID
pid.
Pour spécifier qu'une fonction C doit être appelée lors de la réception d'un signal non mortel, on utilise7.2
void (*signal(int signum, (void *handler)(int))))(int);L'argument
handler est une fonction C qui prend un entier en argument
et sera automatiquement appelée lors de la réception du signal par le
processus. Voici un exemple de fonction traitante :
void traite_signal_usr1( int signum ) {
printf("signal %d recu.\n", signum );
}
Cette fonction est installée par l'appel :
signal( SIGUSR1, traite_signal_usr1 );
Notons que dans certaines versions d'UNIX, le traitant doit être
réinstallé à chaque fois que le signal est reçu (pour cela, appeler
signal() dans la fonction traitante).
On peut aussi spécifier que l'on désire ignorer un type de signal en
utilisant la constante SIG_IGN :
signal( numero_signal_a_ignorer, SIG_IGN );