Bonjour,
Je souhaite synchroniser deux processus avec le signal SIGUSR1 et la fonction sigsuspend. Par ailleurs, je rencontre un comportement étrange. Afin d'illustrer mon problème, j'ai créer un petit programme de test dont voici le code :
Le code est plutot simple : je masque le signal SIGUSR1, je m'envoi SIGUSR1. Il est donc placé dans la liste des signaux pendants. Je me met en attente de celui-ci grace à sigsuspend.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46 /* ** File : test_sigsuspend.c ** Author : kal ** Created : Fri Oct 12 19:46:12 2007 */ #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/types.h> #include <unistd.h> void handler (int signal) { printf("coucou, je suis %d, reception du signal %d\n", getpid(), signal); } int main (int argc, char **argv) { sigset_t mask; /* bloque SIGUSR1 */ sigemptyset (&mask); sigaddset (&mask, SIGUSR1); sigprocmask ( SIG_BLOCK, &mask, NULL); /* envoi de SIGUSR1 */ kill(getpid(), SIGUSR1); /* handler SIGUSR1 */ struct sigaction sa; sa.sa_handler = handler; sigaction(SIGUSR1,&sa,NULL); /* attente de SIGUSR1 */ sigfillset (&mask); sigdelset (&mask, SIGUSR1); sigsuspend (&mask); printf("Fin\n"); return EXIT_SUCCESS; }
Puisqu'un handler est définit pour SIGUSR1, sigsuspend est censé retourner en restaurant le masque des signaux. Or, voici le résultat de l'exécution :
Par ailleurs, si j'ajoute une variable non utilisée de type sigset_t, alors le comportement est correct :kal@kal-laptop:~/POSIX$ ./test_sigsuspend
coucou, je suis 6878, reception du signal 10
Erreur de segmentation (core dumped)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46 /* ** File : test_sigsuspend.c ** Author : kal ** Created : Fri Oct 12 19:46:12 2007 */ #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/types.h> #include <unistd.h> void handler (int signal) { printf("coucou, je suis %d, reception du signal %d\n", getpid(), signal); } int main (int argc, char **argv) { sigset_t mask, toto; /* bloque SIGUSR1 */ sigemptyset (&mask); sigaddset (&mask, SIGUSR1); sigprocmask ( SIG_BLOCK, &mask, NULL); /* envoi de SIGUSR1 */ kill(getpid(), SIGUSR1); /* handler SIGUSR1 */ struct sigaction sa; sa.sa_handler = handler; sigaction(SIGUSR1,&sa,NULL); /* attente de SIGUSR1 */ sigfillset (&mask); sigdelset (&mask, SIGUSR1); sigsuspend (&mask); printf("Fin\n"); return EXIT_SUCCESS; }Quelqu'un peut il m'expliquer ce comportement étrange ?kal@kal-laptop:~/POSIX$ ./test_sigsuspend
coucou, je suis 6914, reception du signal 10
Fin
Partager