Programmation POSIX/Signaux
POSIX complète la gestion des signaux du C en définissant principalement deux fonctions en plus de signal()
et raise()
:
kill()
pour envoyer un signal à un autre processus ;pause()
pour attendre un signal.
Ces deux fonctions sont déclarées dans l'en-tête signal.h
.
Envoi d'un signal à un autre processus
modifierL'en-tête signal.h
nous fournit la fonction
int kill(pid_t pid, int sig);
Le paramètre pid
permet d'identifier le ou les processus qui recevront le signal :
- pid > 0 : identifiant d'un processus ;
- pid == 0 : le signal sera envoyé à tous les processus du groupe du processus courant ;
- pid == -1 : le signal sera envoyé à tous les processus de l'utilisateur. En super-utilisateur (uid=0), tous les processus (sauf système) reçoivent le signal.
Exemple
modifierPar exemple, un processus fils envoie le signal SIGFPE
a son père qui a pour fonction d'afficher dix fois le message "Pere". Le processus fils enverra le signal SIGFPE
(floating point exception, exception de virgule flottante) :
#include <stdio.h>
#include <signal.h>
int main(void)
{
pid_t pid = fork();
if (pid > 0)
{
int iterations = 10;
while (iterations--)
{
puts("Pere");
}
}
else if (pid == 0)
{
puts("Fils");
kill(0, SIGFPE);
}
else
{
puts("Erreur: fork() impossible");
}
return 0;
}
Une sortie possible est :
$ cc exkill.c -o exkill $ ./exkill Fils Floating point exception
Ici, le processus père n'a pas eu le temps d'afficher le message avant l'exécution du fils que celui-ci a généré une exception de virgule flottante. Le traitement par défaut de ce signal étant l'arrêt du processus, le père s'est terminé.
Il est possible, suivant la manière dont les processus sont synchronisés, que le processus père affiche une ou plusieurs lignes avant d'être interrompu par le signal.