Pages : 1
#1 Le 23/12/2016, à 18:37
- shayen
Sémaphores en C
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
Hors ligne
#2 Le 24/12/2016, à 21:07
- shayen
Re : Sémaphores en C
Hors ligne
#3 Le 25/12/2016, à 09:32
- pingouinux
Re : Sémaphores en C
Bonjour,
Je ne suis pas un spécialiste de la question, mais ce serait étonnant que quelqu'un fasse le travail à ta place. Si tu veux de l'aide, commence par fournir un code qui compile, et pose des questions précises sur les points qui te bloquent.
Il n'y a aucun appel dans le main, donc ton programme ne fera rien de toute façon.
Hors ligne
Pages : 1