Traitement des signaux

Résolu
Bonjour,

Dans un programme, je traite des signaux unix, tels que SIGALRM, ...
Pour ce, j'ajoute le signal dans un set (type sigset_t)

Exemple :

sigset_t sigset_wrk; 
sigaddset( sigset_wrk, SIGALRM); 
sigaddset( sigaddset( SIGCHLD); 


Plus loin et plus tard dans le programme, je voudrais savoir si le signal SIGALRM est toujours présent dans le set sigset_wrk.

Existe-t-il une macro du genre FD_ISSET (utilisée sur un fd_set) me permettant de savoir si un signal est toujours présent dans sigset_wrk?

Environnement : Sun Solaris

6 réponses

  1. Modérateur
    Dans l'absolu, vu que cette structure est définie dans <signal.h> le plus simple c'est de regarder dans ce header (/usr/include/signal.h). Mais si on y regarde, apparemment elle peut varier selon l'OS ce n'est pas la bonne approche.

    Par contre, d'après ce lien, il semblerait qu'une fonction existe pour permette de s'en abstraire :
    http://www.gnu.org/software/libc/manual/html_node/Signal-Sets.html

    Apparemment c'est la fonction sigismember() :

    -- Function: int sigismember (const sigset_t *set, int signum)   
    The sigismember function tests whether the signal signum is a member of the signal set set. It returns 1 if the signal is in the set, 0 if not, and -1 if there is an error.   
    
    The following errno error condition is defined for this function:   
    
    EINVAL   
    The signum argument doesn't specify a valid signal.


    Du coup je dirais un truc du genre :

    int sigalarm_is_set = (sigismember(sigset_wrk, SIGALARM) == 1);


    Bonne chance
    1
    1. Modérateur
      À défaut de définir une variable qui mémorise cette information, je te suggère de regarder dans le man pour voir quelles fonctions connexes à sigaddset sont suggérées, il y en a sans doute une qui fera ton bonheur :

      man sigaddset


      Mais à première vue j'ai l'impression que cette information est simplement stockée dans ton sigset_t, non ?
      0
      1. Bonjour,

        Tu as raison, l'information est stockée dans le sigset_t, mais comment accéder à l'information qui m'intéresse (SIGALRM dans mon cas) et quelle est la structure de cette information. Malheureusement, le man de sigaddset ne m'apprend rien à ce sujet.
        Je suppose que le sigset_t peut être indicé par le numéro du signal.

        De toute façon, merci pour ta réponse si rapide même si elle ne répond pas directement totalement à ma question. Si tu as une description de la structure, envoie-la moi. Merci d'avance.
        0
        1. Bonjour,

          Il existe un macro sigismember qui retorne 1 si le signal fait partie du set, sinon le retour est 0
          0
          1. Bonjour,

            Trè gentil de vous être penché sur mon problème. Je pense que nous avons trouvé la solution au même moment. Normal, quand les grands esprits se rencontrent :-).

            Bien à vous
            0
            1. Modérateur
              Parfait, bonne continuation ;-)
              0