next up previous contents index
suivant: 7.2 Les tubes monter: 7. Communications inter-processus précédent: 7. Communications inter-processus   Table des matières   Index

Sous-sections


7.1 Signaux asynchrones

Les signaux permettent d'avertir simplement un processus qu'un événement est arrivé (ils ressemblent aux événements étudiés en cours système).

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).


Tableau 7.1: Quelques signaux important définis par tous les systèmes UNIX. La liste complète est définie sur chaque système dans le fichier include $<$signal.h$>$.
Numéro Nom Signification
1 HUP fin de session
8 FPE exception calcul virgule flottante
9 KILL fin du processus (non modifiable)
10 USR1 définissable par l'utilisateur
11 SEGV référence mémoire invalide
12 USR2 définissable par l'utilisateur
17 CHLD terminaison d'un fils
18 CONT reprise d'un processus stoppé
19 STOP stoppe le processus
29 WINCH redimensionnement de fenêtre

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.


7.1.1 Manipulation des signaux en langage C

On peut envoyer un signal à un autre processus en appelant la primitive
  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 );


next up previous contents index
suivant: 7.2 Les tubes monter: 7. Communications inter-processus précédent: 7. Communications inter-processus   Table des matières   Index
Emmanuel Viennet
1999-01-05