Programmation POSIX/Signaux

Un livre de Wikilivres.

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[modifier | modifier le wikicode]

L'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[modifier | modifier le wikicode]

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