Les modes des synchronisation sont les suivants. Pour plus de clarté les status de retours ne sont pas testés.
Ce mode permet de lancer une commande au serveur sans attendre la fin de son exécution. Les étapes sont les suivantes:
Le client se met en attente sur la ressource
dec_sem_zero(semid, block, timeout);
il remplis le bloc de communication
ini_shm_block_kw(block);
put_shm_block_kw(block, "COMMAND", cmd);
put_shm_block_kw(block, key, content);
il signale qu'il ne reste pas en attente sur la fin de l'exécution mais que le serveur devra rendra la main
block->ackno = 0;
il ordonne au serveur d'exécuter la commande "cmd"
setval_sem(semid, 2, 1);
inc_sem(semid, 1);
L'appel équivalent simplifié pour une commande sans paramètre est:
send_command(semid, block, cmd, NO_FORK_PROCESS,
NO_WAIT_FOR_ANSWER, timeout);
Ce mode permet de lancer une commande au serveur puis attendre la fin de son exécution et pouvoir récupérer des résultats facultatifs. Les étapes sont les suivantes:
Le client se met en attente sur la ressource
dec_sem_zero(semid, block, timeout);
il remplis le bloc de communication
ini_shm_block_kw(block);
put_shm_block_kw(block, "COMMAND", cmd);
put_shm_block_kw(block, key, content);
il signale qu'il reste en attente sur la fin de l'exécution, donc le serveur ne devra pas rendre la main
block->ackno = 1;
il ordonne au serveur d'exécuter la commande "cmd"
setval_sem(semid, 2, 1);
inc_sem(semid, 1);
il se met en attente sur la fin de l'exécution
wait_for_sem(semid, 2, timeout);
il récupère (facultativement) des paramètres en retour
get_shm_block_kw(block, key, content);
il libère la ressource
inc_sem(semid, 0);
L'appel équivalent simplifié pour une commande sans paramètre est:
send_command(semid, block, cmd, NO_FORK_PROCESS,
WAIT_FOR_ANSWER, timeout);
puis le client se met en attente sur la fin de l'exécution
wait_for_sem(semid, 2, timeout);
il récupère (facultativement) des paramètres en retour
get_shm_block_kw(block, key, content);
il libère la ressource
inc_sem(semid,0);
Ce mode est à utilisé avec la plus grande prudence. Il consiste à envoyer des paramètres à un serveur exécutant une tache en arrière plan sans utiliser les sémaphores.
Par exemple, on peut imaginer un serveur recevant un ordre sans attente qui va le faire exécuter une boucle illimitée. Un contrôle de sa tache peut être fait si le serveur lit le bloc de communication durant son processus. Ainsi un ou plusieurs clients (attention, cela se passe sans synchronisation) peut écrire des valeurs dans le bloc de communication permettant d'influencer le comportement du serveur.
Dans l'exemple qui suit, on voit l'initialisation du processus, où on lance la commande "do_for_ever
" avec le flag "OK
". Le serveur recevant cette commande partira et l'exécutera tant que flag sera égal à "OK
"
dec_sem_zero(semid,block,timeout); ini_shm_block_kw(block); put_shm_block_kw(block,"COMMAND","do_for_ever"); put_shm_block_kw(block,"FLAG","OK"); block->ackno = 0; setval_sem(semid, 2, 1); inc_sem(semid, 1);plus tard, pour terminer le processus bouclant, le client, ou un autre client, exécute par exemple:
ini_shm_block_kw(block); put_shm_block_kw(block,"FLAG","STOP");