Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#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

hmm

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