Next: Le signal SIGCHLD Up: Les signaux Previous: Un exemple

Problèmes de la gestion de signaux ATT

Les phénomènes suivants sont décrits comme des problèmes mais la norme POSIX permet d'en conserver certains, mais fournit aussi les moyens de les éviter.

  1. un signal est repositionné à sa valeur par défaut au début de son traitement (handler).

    #include <signal.h>
    
    traitement()  {
        printf("PID %d en a capture un \n", getpid());
    ->     reception du deuxieme signal, realisation d'un exit 
        signal(SIGINT, traitement);
    }
    
    main() {
        int ppid;
        signal(SIGINT,traitement);
        if (fork()==0)
        {/* attendre que pere ait realise son nice() */
            sleep(5);
            ppid = getppid(); /* numero de pere */
            for(;;)
                if (kill(ppid,SIGINT) == -1)
                    exit();
        }
    /* pere ralenti pour un conflit plus sur */
        nice(10);
        for(;;) pause();  <- reception du premier signal  
    /* pause c'est mieux qu'une attente active */
    }
    Si l'on cherche à corriger ce défaut, on repositionne la fonction traitement au début du traitement du signal. Ceci risque de nous placer dans une situation de dépassement de pile: en effet, dans le programme précédent, nous pouvons imaginer que le père peut recevoir un nombre de signaux arbitrairement grand pendant le traitement d'un seul signal, d'où une explosion assurée de la pile (il suffit en effet que chaque empilement de la fonction traitement soit interrompu par un signal)
    traitement(){
        signal(SIGINT,traitement);
    ->   signal SIGINT
        printf("PID %d en a capture un \n",getpid());
    }
    On peut aussi ignorer les signaux pendant leur traitement, mais cela peut créer des pertes de réception.
    Enfin, la solution BSD/POSIX où l'on peut bloquer et débloquer la réception de signaux à l'aide du vecteur de masquage (sans pour autant nous assurer de la réception de tous les signaux !!). De plus, en POSIX, le traitement d'un signal comporte une clause de blocage automatique. On indique quels signaux doivent être bloqués pendant le traitement du signal, grâce à un vecteur de masquage dans la structure sigaction.

    Ceci est le comportement naturel de gestion des interruptions matérielles: on bloque les interruptions de priorité inférieure pendant le traitement d'un interruption.

  2. Seconde anomalie des signaux sous System V < V4: certains appels systèmes peuvent être interrompus et dans ce cas la valeur de retour de l'appel système est -1 (échec). Il faudrait, pour réaliser correctement le modèle d'une interruption logicielle, relancer l'appel système en fin de traitement du signal. (Sous BSD ou POSIX, il est possible de choisir le comportement en cas d'interruption d'un appel système grâce à la fonction siginterrupt, c-a-d relancer ou non l'appel système, un appel à read, par exemple, peut facilement être interrompu si il nécessite un accès disque).
  3. Troisième anomalie des signaux sous ATT: si un signal est ignoré par un processus endormi, celui-ci sera réveillé par le système uniquement pour apprendre qu'il ignore le signal et doit donc être endormi de nouveau. Cette perte de temps est dûe au fait que le vecteur des signaux est dans la zone u et non pas dans le bloc de contrôle du processus.



Next: Le signal SIGCHLD Up: Les signaux Previous: Un exemple

Dominique REVUZ
Mon Feb 2 12:10:31 MET 1998
Une Bug Un mail Merci