2010-10-24 5 views
8

Quelle est la meilleure façon de faire fonctionner C sous Linux pour configurer un programme capable de gérer plusieurs signaux POSIX avec la même fonction?Quelle est la bonne façon d'avoir une seule fonction de gestionnaire de signal pour plusieurs signaux?

Par exemple, dans mon code que j'ai une fonction de gestionnaire que je veux appeler génériquement quand jamais un signal est pris pour effectuer certaines actions:

/* Exit handler function called by sigaction */ 
void exitHandler(int sig, siginfo_t *siginfo, void *ignore) 
{ 
    printf("*** Got %d signal from %d\n", siginfo->si_signo, siginfo->si_pid); 
    loopCounter=0; 

    return; 
} 

J'ai mis en place deux signaux pour attraper en ayant sigaction individuelle appelle pour chaque signal:

/* Set exit handler function for SIGUSR1 , SIGINT (ctrl+c) */ 
struct sigaction act; 
act.sa_flags = SA_SIGINFO; 
act.sa_sigaction = exitHandler; 
sigaction(SIGUSR1, &act, 0); 
sigaction(SIGINT, &act, 0); 

Est-ce la bonne façon de configurer ce type de manipulation? Existe-t-il un autre moyen de ne pas énumérer tous les numéros de signaux possibles?

Répondre

3

Je ne vois pas comment vous pouvez directement définir un seul gestionnaire pour tous les signaux. Cependant, vous pouvez obtenir à peu près en utilisant sigfillset() pour générer un ensemble contenant tous les numéros de signaux valides, puis parcourir les numéros de signaux possibles en utilisant sigismember() pour déterminer si ce nombre est dans l'ensemble et définir un gestionnaire si c'est le cas. OK, je ne vois pas de méthode pour déterminer le nombre maximal de signaux possible, donc vous devrez peut-être deviner une valeur maximale appropriée.

+0

Merci, c'est une bonne idée. Je suppose que je peux continuer à énumérer les signaux que je voudrais attraper, puisque je suis nouveau à C J'étais curieux de savoir s'il me manquait quelque chose. – ammianus

3

Le paramètre "signum" de l'appel système "sigaction" est une valeur entière qui ne fonctionne pas comme indicateur. Autant que je sache, il n'y a aucun moyen d'attribuer une fonction de gestionnaire pour plusieurs signaux en un seul appel.

+0

Merci pour la réponse claire. – ammianus

Questions connexes