74 lines
1.7 KiB
C
74 lines
1.7 KiB
C
|
#include <stdio.h> /* entrées sorties */
|
||
|
#include <unistd.h> /* pimitives de base : fork, ...*/
|
||
|
#include <stdlib.h> /* exit */
|
||
|
#include <sys/wait.h> /* wait */
|
||
|
#include <signal.h> /* 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;
|
||
|
}
|