J'étudie actuellement les concepts de programmation réseau dans lesquels je suis tombé sur l'une des fonctions pselect() qui résout le problème de select ie. avec select(), il y a un risque de problème qui est celui entre le test de intr_flag et l'appel à sélectionner, si le signal se produit, il sera perdu si select bloque pour toujours.comment pselect bloque le signal en utilisant le masque de signal dans la programmation réseau
if (intr_flag)
handle_intr(); /* handle the signal */
if ((nready = select(...)) < 0) {
if (errno == EINTR) {
if (intr_flag)
handle_intr();
}
Cependant, il est dit que Avec pselect, nous pouvons le code maintenant cet exemple de manière fiable que
sigset_t newmask, oldmask, zeromask;
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);
sigprocmask(SIG_BLOCK, &newmask, &oldmask); /* block SIGINT */
if (intr_flag) //here
handle_intr(); /* handle the signal */
if ((nready = pselect (... , &zeromask)) < 0) {
if (errno == EINTR) { //here
if (intr_flag)
handle_intr();
}
...
}
L'explication qu'il donne pour que le code soit fiable est que - Avant de tester la variable intr_flag, nous bloquons SIGINT. Lorsque pselect est appelé, il remplace le masque de signal du processus par un ensemble vide (c'est-à-dire, zeromask), puis vérifie les descripteurs, en allant éventuellement au repos. Mais lorsque pselect revient, le masque de signal du processus est réinitialisé à sa valeur avant l'appel de pselect (c'est-à-dire, SIGINT est bloqué).
Mais dans le code avec pselect mentionné ci-dessus, nous bloquons les signaux alors comment pouvons-nous vérifier l'erreur EINTR? Puisque le pselect bloque tous les signaux, alors quand l'interruption se produit, il devrait empêcher que cela perturbe ou soit transmis au processus. Ce n'est que lorsque pselect revient que le signal peut être délivré.
Selon les lignes devant qui les commentent ici est mentionné, INTERRUPTION signal peut encore se produire pselect est appelé ou entre le premier chèque et pselect ou lorsque pselect est appelé contredisant le but de bloquer l'interruption et tous les autres signaux et devraient donc conduire à la condition de course comme avec select est là.
S'il vous plaît, n'importe qui explique comment cela est possible car je suis nouveau à ces concepts.
très belle explication :) Merci! –
De rien. –