Signal temps-réel non bloqué
Bonjour,
J'utilise les signaux temps-réels pour permettre des discussions rapides entre deux processus.
Code:
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 !!