2010-09-20 9 views
2

Est-il possible en C pour connaître les informations suivantes sur les signaux:Comment puis-je savoir l'état actuel des signaux

  1. est certain signal est bloqué maintenant?
  2. Sommes-nous à l'intérieur d'une fonction de gestion de signal (c'est-à-dire, le code actuel a-t-il été appelé à partir d'une fonction appelée gestionnaire de signal pour un signal donné)? Si oui, puis-je savoir quel est le signal actuel?

Merci

+0

aux pages Jetant de l'homme que je commence à me demander si vous n'avez pas besoin de garder vous suivre ... – dmckee

Répondre

3

Vous pouvez savoir quels signaux sont actuellement bloqués en appelant sigprocmask avec le second argument null et le troisième argument non nul (le premier argument est ignoré dans ces conditions, donc passez zéro). Il va remplir le sigset_t que vous fournissez comme troisième argument.

Je ne connais aucun moyen de savoir s'il existe une trame de gestionnaire de signal sur la pile.Je suppose que vous pourriez être en mesure d'utiliser la famille de fonctions _Unwind_* en quelque sorte, mais ce serait un horrible kludge.

0

Tout d'abord, vous pouvez utiliser sigprocmask avec un pointeur ensemble vide.

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 

a. comment peut être réglé sur: SIG_UNBLOCK (le signal dans le jeu sont retirés de l'ensemble des signaux bloqués Il est légal de tenter de débloquer le signal qui est pas bloqué.)

b. set peut être défini sur NULL (car vous ne souhaitez pas modifier les signaux bloqués)

c. Si oldset n'est pas NULL, la valeur précédente du masque de signal est stockée dans oldset. Ergo, vous obtenez les signaux bloqués dans l'emplacement dont l'adresse est stockée dans oldset.

En second lieu, pour savoir si vous êtes dans une routine de traitement du signal, lorsque vous écrivez la définition du gestionnaire de signaux, vous pouvez accepter int Signum comme paramètre, comme dans:

void mySignalHandler(int signum); 

Si vous voulez savoir si vous pouvez bloquer d'autres signaux à ce moment-là, vous pouvez simplement avoir une fonction de blocage au début & débloquer la fonction à la fin (en utilisant sigprocmask()). Vous pouvez même régler ces signaux sur l'état SIG_IGN pour les ignorer lors de la gestion du signal actuel (en utilisant signal()).

Enfin, s'il vous plaît lire l'homme pages!

Edit: Puisque l'auteur dit qu'il les a ne lit, je recommande d'utiliser la commande apropos pour trouver ces fonctions difficiles à trouver. Par exemple,

$ apropos "blocked signals" 

vous donne environ 5 coups sûrs, dont 1 sigprocmask

Cheers!

+0

Merci. En fait, je lis habituellement les pages de manuel. Je sais à propos de la routine de gestionnaire de signal, le fait est que je ne suis pas le propriétaire de cette fonction, et c'est pourquoi j'ai demandé cela. Je n'étais pas au courant de la fonction sigprocmask. Merci! – eran