Bonjour,
On nous a demandé de programmer en C un modèle Allocateurs de ressources en C : on a un tableau de ces ressources , et N processus qui veulent utiliser chacun une ressource .La demande ce fait l’aide d’une fonction Allouer qui lui renvoie le numéro de la ressource qui lui a été affectée. Le processus doit libérer la ressource à la fin de son travail à l’aide de la procédure Restituer. Le prof nous demande de faire un jeu d’essai avec au minimum 3 processus . Voila mon code pour le moment
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<string.h>
#include<sys/sem.h> /* semget, semctl, semop /
#include<sys/ipc.h> / ftok /
#include<sys/shm.h>
#include <stdlib.h> / malloc /
#include <stdio.h> / perror, printf /
#include <errno.h> / errno */
/Clés des sémaphores/
#define SNlibre 13 // Sémaphore qui represente le nombre de machine libre
#define Mutex 12 // Sémaphore d’exlusion mutuelle entre les deux procedure allouer et restituier
/*Les variables globales*/
#define N 3//nombre de processus
typedef enum boul
{true, false} boul;
boul booleen ;
boul mdispo[3]={faux};//toutes les machine sont disponible au début
/********P(m)********/
int P (int m)
{
struct sembuf operation; // structure prédéfinie en sem.h
operation.sem_num = 0; // numéro de sémphore concerné par l'opération : notre sémaphore est le premier est le seul
operation.sem_op = -1; /*décrit l'opértation à effectuer sur le sémphore==> décrémmente la valeur du sémaphore de 1 s'il est différent de 0.
Dans le cas contraire, le processus appelant est bloqué et placé dans une file d'attente liée
au sémaphore ;*/
operation.sem_flg = 0;
return semop (m , &operation , 1); // effectue 1 seule opération sur le sémaphore
}
/********V(m)********/
int V (int m)
{
struct sembuf operation; // structure prédéfinie en sem.h
operation.sem_num = 0; // numéro de sémphore concerné par l'opération
operation.sem_op = +1; /*décrit l'opértation à effectuer sur le sémphore==>incremente la valeur du sémaphore de 1 s'il n'y a pas de
processus dans la file d'attente. Dans le cas contraire, ce sémaphore reste inchangé et on libère le
premier processus de la file d'attente*/
operation.sem_flg = 0;
return semop (m , &operation , 1); // effectue 1 seule opération sur le sémaphore
}
/***Fonction Allouer*****/
/*Cette fonction retourne le numero de la machine alloué*/
int Allouer()
{
int num =0;
P(Mutex);
P(SNlibre);
while (mdispo[num]==true) num++;
mdispo[num]=false;
V(Mutex);
return num;
}
/***Procedure Restituer*****/
/*Procedure pour restituer la machine de numéro "num" après son usage*/
void Restituer (int num)
{
P(Mutex) ;
mdispo[num] = false ;
V(Mutex) ;
V(Nlibre) ;
}
int main()
{
return 0;
}
La je suis bloqué ! je ne sais pas comment faire un jeu d’essai (3 processus ).Et si un processus alloue une ressource quand est ce qu’il vas la libérer J’ai penser à faire une boucle de fork() mais je ne sais pas si c’est juste ou non ?
Merci d’avance
Coedialement