#include /* entrées sorties */ #include /* pimitives de base : fork, ...*/ #include /* exit */ #include /* wait */ #include /* opérations sur les signaux */ /* Traitement du signal */ void handler_sigint(int signal_num) { printf("Reception %d\n", signal_num); return; } // TODO: utiliser sigaction int main() { // on affiche le pid printf("pid=%d\n", getpid()); /* associer un traitant au signal USR1 */ signal(SIGUSR1, handler_sigint); /* associer un traitant au signal USR2 */ signal(SIGUSR2, handler_sigint); sigset_t ens_signaux_int; sigset_t ens_signaux_usr1; // on vide les set de signaux sigemptyset(&ens_signaux_int); sigemptyset(&ens_signaux_usr1); // on ajoute SIGINT à ens_signaux_int sigaddset(&ens_signaux_int, SIGINT); // on ajoute SIGUSR1 à ens_signaux_usr1 sigaddset(&ens_signaux_usr1, SIGUSR1); // on masque les signaux sigprocmask(SIG_SETMASK, &ens_signaux_int, NULL); sigprocmask(SIG_BLOCK, &ens_signaux_usr1, NULL); // on attend 10 secondes, envoyer SIGINT au clavier printf("sleep(10)\n"); sleep(10); // on s'envoie 2 signaux SIGUSR1 kill(SIGUSR1, getpid()); kill(SIGUSR1, getpid()); // on attend 5 secondes printf("sleep(5)\n"); sleep(5); // on s'envoie 2 signaux SIGUSR2 kill(SIGUSR2, getpid()); kill(SIGUSR2, getpid()); // on démasque SIGUSR1 sigprocmask(SIG_UNBLOCK, &ens_signaux_usr1, NULL); // on attend 10 secondes printf("sleep(10)\n"); sleep(10); // on démasque SIGINT sigprocmask(SIG_UNBLOCK, &ens_signaux_int, NULL); // message de terminaison printf("Salut\n"); return EXIT_SUCCESS; }