Bonjour,
J'utilise les signaux temps-réels pour permettre des discussions rapides entre deux processus.
Le code présenté est celui du client. Le client envoie SIGRESA (SIGRTMIN+1) au serveur. Le serveur calcul la réponse et l'envoie via le signal SIGRESA et un champ de la structure siginfo_t. Si je met un sleep(1) avant l'envoie de la réponse, le client atteint le sigwaitinfo et tout se passe bien. Sinon, le programme s'interrompt avec le message :
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 siginfo_t infos; sigset_t ensemble; /* struct sigaction action; action.sa_sigaction = gestionnaire; action.sa_flags = SA_SIGINFO; sigemptyset(&action.sa_mask); sigaction(SIGRESA, &action, NULL); */ sigaddset(&ensemble, SIGRESA); sigprocmask(SIG_BLOCK, &ensemble, NULL); printf("[%d]", __LINE__); printf("PID : %d\n", pid); union sigval valeur; if(sigqueue(pid,SIGRESA,valeur)<0){ printf("[%d]", __LINE__); perror("sigqueue"); exit(EXIT_FAILURE); } printf("[%d]\n", __LINE__); if(sigwaitinfo(&ensemble, &infos)<0){ printf("[%d]", __LINE__); perror("sigwaitinfo"); exit(EXIT_FAILURE); }
Real-time signal 0
Ce comportement n'est pas normal car le signal devrait être bloqué depuis la ligne :
sigaddset(&ensemble, SIGRESA);
sigprocmask(SIG_BLOCK, &ensemble, NULL);
Lorsque j'utilise un gestionnaire (cf. lignes commentées), le signal est bien détourné vers celui-ci.
Quelqu'un saurait pourquoi le signal n'est pas bloqué malgré sigprocmask et comment faire pour que le comportement souhaité soit atteint svp ?
Merci !!
Partager