Traitement des signaux

Résolu
RMEU Messages postés 36 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    À 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
  3. RMEU Messages postés 36 Statut Membre
     
    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
  4. RMEU Messages postés 36 Statut Membre
     
    Bonjour,

    Il existe un macro sigismember qui retorne 1 si le signal fait partie du set, sinon le retour est 0
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. RMEU Messages postés 36 Statut Membre
     
    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
  7. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Parfait, bonne continuation ;-)
    0