2 votes

Comment faire pour que plus de deux signaux consécutifs soient captés ?

Si j'envoie plusieurs Hangup signale au programme suivant que seuls deux d'entre eux seront traités et que le reste sera ignoré :

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int id;
void handler(int s)
{
    id++;
    int i;
    for(i=0; i<3; i++)
    {
        printf("Sig %d\n", id);
        sleep(2);
    }
}

int main()
{
    int i;
    signal(SIGHUP, handler);
    for( i=0; ; i++ )
    {
        printf("%d\n", i);
        sleep(1);
    }
    return 0;
}

J'utilise la commande suivante pour envoyer un signal au processus :

kill -l {#process}

Si j'exécute la commande ci-dessus trois fois de suite, le 3ème signal sera ignoré comme dans la sortie suivante :

0
1
2
3
4
5
6
7
Sig 1
Sig 1
Sig 1
Sig 2
Sig 2
Sig 2
8
9
10
11
12

Y a-t-il un moyen d'attraper aussi le troisième signal ?

2voto

blaze Points 2930

Normalement, vous ne pouvez pas le faire avec des signaux standard. Le noyau Unix ne met généralement en file d'attente qu'un seul signal en attente. Si Sig2 et Sig3 sont envoyés pendant que le processus dort dans le handler Sig1, ils sont fusionnés.

Vous pouvez utiliser sigaction(2) pour configurer votre gestionnaire de signaux et lui fournir l'indicateur SA_NODEFER. Cela permettra de délivrer un nouveau signal tout en restant dans le gestionnaire de signal. Assurez-vous que votre gestionnaire est ré-entrant, c'est une solution qui peut provoquer des erreurs.

Il existe également une extension POSIX.1b (POSIX.1-2001) appelée "signaux en temps réel". De tels signaux peuvent être mis en file d'attente plusieurs fois, mais SIGHUP n'en fait pas partie. signal(7) sous Linux indique que les signaux en temps réel sont numérotés de 33 (SIGRTMIN) à 64 (SIGRTMAX).

1voto

Joachim Pileborg Points 121221

Sous Linux, les signaux en attente sont représentés par un seul bit. Cela signifie que si plusieurs signaux sont générés alors que le gestionnaire est déjà en cours d'exécution, il ne sera appelé qu'une seule fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X