Traitement des signaux

Résolu/Fermé
RMEU Messages postés 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014 - Modifié par mamiemando le 10/04/2013 à 10:34
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 - 10 avril 2013 à 20:02
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 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
Modifié par mamiemando le 10/04/2013 à 10:56
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 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
10 avril 2013 à 10:37
À 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 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014
10 avril 2013 à 10:44
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 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014
10 avril 2013 à 10:50
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 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014
10 avril 2013 à 10:59
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 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
10 avril 2013 à 20:02
Parfait, bonne continuation ;-)
0