Préambule : rappel du format des primitives permettant l'utilisation des messages queues
Exercice 1
Exercice 2
On considère l'architecture logicielle suivante :
A - CLIENT
C - Les contraintes :
- il faut que les clients soient tous fils du serveur
- il faut deux tubes anonymes par couple communiquant.
 |
|
La difficulté : Attendre les nombres n sur pip1 et pip12 Tirage aléatoire Ecrire le résultat dans pip2 ou pip22
L'opération de lecture sur un tube est une opération bloquante si le tube sur lequel elle est effectuée est un tube vide. A
priori, on ne sait pas lequel des deux tubes sera prêt en lecture en premier. Alors, on peut se mettre en lecture sur pip1,
être bloqué alors que pip12 est prêt.
- Il existe deux solutions :
- rendre la lecture non bloquante et effectuer une attente active sur les deux tubes.
- s'endormir en attente d'un tube prêt. Pour cela on utilise la primitive SELECT.
Utilisation de la primitive SELECT :
|
1/ On construit un ensemble de descripteurs en lecture sur lequel on souhaite se mettre en attente.
ens_r = {pip[0], pip12[0]}
Cette construction se fait à l'aide des macros FD_ZERO(ens_r) - mise à vide de l'ensemble - et FD_SET(ens_r, element) - ajout
de l'élément à l'ensemble.
2/ On se met en attente sur ces descripteurs
SELECT (ens_r,
.)
3/ On sort du SELECT car un des descripteurs au moins est prêt (le tube n'est plus vide et une lecture peut être faite sans
risque d'être bloqué). On teste chacun des descripteurs par le biais de la primitive FD_ISSET
FD_ISSET(pip1[0]) est vrai ou FD_ISSET(pip12[0]) est vrai.
A titre indicatif, voici le code C correspondant.
Allocation mémoire
Exercices dirigés
|