# Sémaphores en C

**URL:** <https://www.debian-fr.org/t/semaphores-en-c/72117>\
**Category:** Programmation\
**Created:** [Décembre 23, 2016, 5:38 UTC](https://www.debian-fr.org/t/semaphores-en-c/72117 "2016-12-23T17:38:15Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![shayen](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/82dd89/32.png) [@shayen](https://www.debian-fr.org/u/shayen)\
**Post date:** [Décembre 23, 2016, 5:38 UTC](https://www.debian-fr.org/t/semaphores-en-c/72117/1 "2016-12-23T17:38:15Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![shayen](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/82dd89/32.png) [@shayen](https://www.debian-fr.org/u/shayen)\
**Post date:** [Décembre 23, 2016, 8:32 UTC](https://www.debian-fr.org/t/semaphores-en-c/72117/2 "2016-12-23T20:32:52Z")

</div>

Help ! 😭
