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 :

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;
}
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.

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 :
kal@kal-laptop:~/POSIX$ ./test_sigsuspend
coucou, je suis 6878, reception du signal 10
Erreur de segmentation (core dumped)
Par ailleurs, si j'ajoute une variable non utilisée de type sigset_t, alors le comportement est correct :
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;
}
kal@kal-laptop:~/POSIX$ ./test_sigsuspend
coucou, je suis 6914, reception du signal 10
Fin
Quelqu'un peut il m'expliquer ce comportement étrange ?