Le client veut donc conserver son serveur. Il pourra, et cela est très important, tester le status de l'exécution de la commande. Une variable du bloc de communication nommé ackno indique si le serveur doit rendre la main (ackno == 0) ou s'il ne doit pas rendre la main (ackno == 1)
En gardant la main, le client pourra envoyer de nouvelles commandes sans se faire perturber par d'autres clients en attente. Il faut toutefois être conscient que si on garde la main, il faut absolument s'assurer que le serveur ait finis son travail avant d'écrire ou lire dans le bloc. La fonction de lancement de l'exécution de la commande sur le serveur en mode wait est shmack() et la fonction d'attente de la fin de cette exécution est shmwack(). Par exemple:
INTER > shmstat=shmput("COMMAND", "@dosomething") INTER > shmstat=shmack() INTER > shmstat=shmwack()Lors de l'exécution, les sémaphores sont dans l'état suivant:
Sem #0 = 0 ncount=0 zcount=0 Sem #1 = 0 ncount=0 zcount=0 Sem #2 = 1 ncount=0 zcount=0 ackno=1Dès la fin de l'exécution, les sémaphores sont dans l'état suivant:
Sem #0 = 0 ncount=0 zcount=0 Sem #1 = 0 ncount=1 zcount=0 Sem #2 = 0 ncount=0 zcount=0 ackno=1Si le temps de réponse doit être limité par un timeout, on le donne en secondes dans l'appel à shmwack(). Par exemple, une attente se 20 secondes s'écrira:
INTER > shmstat=shmwack(20)Le status retourné lors du shmwack() permet de déterminer s'il y a eu une erreur, de quel coté elle a eu lieu et le type d'erreur. Les valeurs de status possibles sont:
1 | erreur Inter sur le serveur |
2 | serveur déconnecté |
3 | SIGINT (CTRL-C) sur le serveur |
101 | SIGHUP sur le client |
102 | SIGINT (CTRL-C) sur le client |
113 | SIGPIPE sur le client |
114 | SIGALRM (timeout) sur le client |