Le dialogue entre les 2 processus est le suivant :
client | serveur | ||
0 | récupère les identifiant du segment, des sémaphores et initialise le générateur. | 0 | Crée le segment mémoire. Crée et initialise les sémaphores. |
1 | demande à acquérir seg_dispo | 1 | attend que seg_init passe à 0 |
2 | initialise segment et acquiert seg_init | 2 | calcule résultat et acquiert res_ok |
3 | attend que res_ok passe à 0 | 3 | essaie d'acquérir seg_init (indique résultat lu) |
4 | lit résultat et libère seg_init | 4 | libère res_ok puis seg_init |
5 | libère seg_dispo | 5 | boucle sur 1 |
6 | affiche résultats | ||
7 | boucle sur 1 |
Un certain nombres de procédures réunies dans la librairie libseg.a sont disponibles pour réaliser le programme :
[linestyle=none,fillstyle=solid,fillcolor=lightgray](1,-0.5)(13,-0.5)(13,-2)(1,-2)(1,-0.5)
init_rand() : initialise le générateurLes routines suivantes bloquent le processus en attendant d'aboutir. semid désigne l'identifiant de l'ensemble de sémaphores :
long getrand() : retourne un entier long signé
int ntty() : retourne un entier correspondant au numéro du tty
[linestyle=none,fillstyle=solid,fillcolor=lightgray](1,-0.5)(13,-0.5)(13,-2)(1,-2)(1,-0.5)
wait_sem(semid, sem) : attend que le sémaphore sem passe à 0
acq_sem(semid,sem) : tente d'acquérir le sémaphore sem
lib_sem(semid,sem) : libère le sémaphore sem
La structure du segment sera définie ainsi :
[linestyle=none,fillstyle=solid,fillcolor=lightgray](0,-0.4)(12,-0.4)(12,-3.8)(0,-3.8)(0,-0.4)
struct shmseg { int tty; /* Numero de tty */ int req; /* numero de requete */ long tab[maxval]; /* Tableau de valeurs */ long result; /* resultat */ }
Cette structure est définie sous le type SEGMENT dans le fichier
segdef.h. Ce fichier réunit tous les includes nécessaires ainsi que
la définition des constantes suivantes :
cle | (key_t)3 | clé d'accès commune au segment et aux sémaphores |
seg_dispo | 0 | sémaphore accès segment |
seg_init | 1 | sémaphore segment initialisé |
res_ok | 2 | sémaphore résultat prêt |
maxval | 100 | nombre de valeurs à calculer |
segsize | taille du type SEGMENT |
L'application sera conçue à partir de 4 fichiers :
Le fichier client devra déclarer une structure associée à la
manipulation des sémaphores : struct sembuf sop;
L'organisation du programme sera la suivante :