1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| struct MyContext {
enum { READY, RCV_USR1, ....
} LastState;
} myContext;
static void myHandler(int sig, siginfo_t *si, void *myData) {
printf("Reçu signal %d \n", sig );
// en fonction de 'sig' et de 'myContext.LastState' on peut avoir un nouveau 'myContext.LastState'
....
}
int main(int argc, char *argv[]) {
struct sigaction sa={};
myContext.LastState = READY;
struct sigset_t set;
sigemptyset( &set );
sigaddset( &set, SIGUSR1 );
sigaddset( &set, SIGUSR2 );
sa.sa_flags = SA_SIGINFO;
sigemptyset( &sa.sa_mask );
sa.sa_sigaction = myHandler;
sa.sa_mask = set; // empêcher la simultanéité des signaux attendus
// correctif, il n'est pas possible de passer un contexte local par la norme Posix
// et une globale est aussi bien qu'un contexte global!
if ( sigaction( SIGUSR1, &sa, NULL ) == -1)
handle_error("sigaction");
if ( sigaction( SIGUSR2, &sa, NULL ) == -1 ) // même fct pour ce signal
handle_error("sigaction");
....
} |
Partager