2010-10-24 17 views
8

Qual è il modo migliore in C su Linux per impostare un programma in grado di gestire più segnali POSIX con la stessa funzione?Qual è il modo corretto per avere una singola funzione di Signal Handler per più segnali?

Per esempio nel mio codice ho una funzione di gestione che voglio genericamente chiamata quando mai un segnale viene catturato per eseguire alcune azioni:

/* 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; 
} 

ho istituito due segnali di catturare avendo sigaction individuale richiede per ogni segnale:

/* 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); 

E 'questo il modo corretto di impostare questo tipo di gestione? C'è un altro modo in cui non devo enumerare tutti i possibili numeri di segnale?

risposta

3

Non riesco a vedere come sia possibile impostare direttamente un singolo gestore per tutti i segnali. Tuttavia, è possibile ottenere discretamente utilizzando sigfillset() per generare un set contenente tutti i numeri di segnale validi, quindi scorrere i possibili numeri di segnale utilizzando sigismember() per determinare se tale numero è nell'insieme e impostare un gestore in tal caso. OK, non riesco a vedere un metodo per determinare qual è il numero massimo di segnali possibile, quindi potresti dover indovinare un valore massimo adatto.

+0

Grazie, è una buona idea. Credo di poter continuare a enumerare i segnali che mi piacerebbe catturare, dato che sono nuovo di C ero curioso di sapere se mi mancava qualcosa. – ammianus

3

Il parametro "signum" della chiamata di sistema "sigaction" è un valore intero che non funziona come flag.

Per quanto ne so, non c'è modo di assegnare una funzione di gestore per più segnali in una chiamata.

+0

Grazie per la chiara risposta. – ammianus

Problemi correlati