2011-12-20 14 views
6

devo inviare due segnali ad un processo, SIGUSR1 e SIGUSR2, al fine di modificare una particolare variabile booleana nel programma (SIGUSR1 imposta su veri, SIGUSR2 imposta su falsa) . Così ho scritto una funzione signalHandler() per controllare il comportamento di SIGUSR1 o SIGUSR2. Il problema è: come impostare sigaction() per gestire questa particolare attività? Ho trascorso molto tempo su Google, ho letto ovunque che dovrei usare sigaction() invece del obsoleto signal(). Nella pagina man ho trovato questoUso di sigaction()

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); 

in signum devo mettere il tipo di segnale che voglio gestire, allora ho un parametro struct sigaction:

struct sigaction { 
     void  (*sa_handler)(int); 
     void  (*sa_sigaction)(int, siginfo_t *, void *); 
     sigset_t sa_mask; 
     int  sa_flags; 
     void  (*sa_restorer)(void); 
    }; 

nel primo campo ho pensato dovrei impostare il nome del mio gestore di segnale, ma non so come posso impostare gli altri campi.

Infine, a cosa serve: struct sigaction *oldact?

+0

'oldact' memorizza il precedente stato di gestione del segnale per il numero di segnale' signum'. – moshbear

+0

@moshbear posso impostarlo su NULL se non voglio usarlo? – Sicioldr

+0

__ Sì, è possibile. (scusate i trattini bassi, ma c'è un limite di lunghezza minimo di 15 caratteri per i commenti). – moshbear

risposta

7

Vedere la pagina di manuale sigaction(2). È tutto descritto lì.

Fondamentalmente si imposta sa_handler o sa_sigaction a seconda se si desidera ricevere le informazioni aggiuntive sul segnale.

Se si imposta il successivo, è necessario aggiungere SA_SIGINFO alle bandiere. Altrimenti i flag dovrebbero probabilmente essere 0 per il tuo caso. Probabilmente vorrai che le chiamate di sistema falliscano con errno EINTR quando vengono interrotte con il segnale (comportamento predefinito), quindi puoi prendere in considerazione il nuovo valore della variabile prima di riavviarle, ma se hai finito volessi riavviarle automaticamente (select e poll non sono mai riavviato), è possibile impostare il flag SA_RESTART.

Il sa_mask è un insieme di segnali che devono essere posticipati mentre questo gestore singal è in esecuzione. Dovresti impostare almeno i due segnali, in modo che non si confondano se arrivano in rapida successione.

E l'ultimo, sa_restorer è obsoleto e inutilizzato comunque.