Traitement des signaux

Résolu
RMEU Messages postés 36 Statut Membre -  
mamiemando Messages postés 34188 Statut Modérateur -
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

mamiemando Messages postés 34188 Statut Modérateur 7 890
 
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
mamiemando Messages postés 34188 Statut Modérateur 7 890
 
À 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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
mamiemando Messages postés 34188 Statut Modérateur 7 890
 
Parfait, bonne continuation ;-)
0