Bonjour,

J'utilise les signaux temps-réels pour permettre des discussions rapides entre deux processus.

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);
}
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 :
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 !!