next up previous contents
Next: Accès aux variables du Up: Les autres fonctions Previous: SRVWORK()

Communication bloquante

Si un client meurt alors qu'il a réservé un serveur, on obtient une situation blocante. Il faut libérer le sémaphores à la place du défunt. On le fait en posant SEM0=0 avec la fonction shmzero() ou avec ipcstat.

Lors d'un reset automatique, il faut prendre garde au fait que si d'autres clients sont en attente sur le serveur bloqué, le premier de la queue sera libéré à l'instant même du reset du sémaphore et pourra travailler avec le serveur. Cette situation ne doit pas arriver, si par exemple le client défunt devait faire un action essentielle avant l'action du second client.

La fonction shmncnt() retourne le nombre de client en attente sur le serveur. Cela signifie que dans le cas où aucun client n'est en attente. Le reset peut s'opérer sans aucun risque. Si des clients sont en attente, il est souvent préférable de laisser un contrôle manuel à l'utilisateur. Par exemple:

 
write "Attention rupture de séquence"
if shmncnt().gt.0 then
    write "Des clients sont en attente"
    write "Il faut remettre le système en état manuellement"
else
    write "Il n'y a pas de client en attente"
    write "On  fait un reset du sémaphore 0"
    shmstat=shmzero()
endif
erreur /set


WEBER Luc
Mon May 10 13:34:58 MET DST 1999