1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
/*
* Fichier fonctions.c
* Regroupe les fonctions necessaires pour les semaphores
* Date Modification: 28 Decembre 2004
*/
#include "fonctions.h"
/*------------------------------------------------------
* Entrée dans la section critique
* Si la demande est refusée, le processus
* sera mis en file d'attente
*
* Paramètres:
* id_sem :ID du sémaphore
* nbre_jetons: Nombre de jetons que le processus souhaite prendre
* Ceci est un entier non signé donc positif
*/
int P_sem(int id_sem,unsigned int nbre_jetons)
{
int resultat =0;
struct sembuf A;
A.sem_num =0;
A.sem_flg =SEM_UNDO;
A.sem_op = -nbre_jetons;
/*sem_op <0 donc le process PREND un jeton
* cela signifie qu'il se met en file d'attente
*
*/
resultat = semop(id_sem,&A,0);
return resultat;
}
/*------------------------------------------------------
* Sortie de la section critique
* Paramètres:
* id_sem :ID du sémaphore
* nbre_jetons: Nombre de jetons que le processus souhaite rendre
* Ceci est un entier non signé donc positif
*/
int V_sem(int id_sem,unsigned int nbre_jetons)
{
int resultat =0;
struct sembuf A;
A.sem_num =0;
A.sem_flg =SEM_UNDO;
A.sem_op =nbre_jetons;
/*sem_op >0 donc le process REND un jeton
* cela signifie qu'il quitte la section critique
*
*/
resultat = semop(id_sem,&A,0);
return resultat;
}
/*------------------------------------------------------
* Création d'un sémaphore ou Récuperation de l'ID du semaphore
* Paramètre: Clef du sémaphore
* C'est la clé commune et elle est connue de tous les process qui
* appelle ce semaphore
*/
int creation_recuperation_sem(int clef_sem)
{
int id_sem =0;
id_sem =semget(clef_sem,1,0666 |IPC_CREAT);
return id_sem;
}
/*------------------------------------------------------
* Paramètres:
* id_sem :ID du sémaphore
* fonction permettant d'initialiser le semaphore
* dans notre cas, on l'initialise à 0 ou à 1
*/
int initialisation_sem(int id_sem,int valeur)
{
int resultat =0;
/*Comme nous initialisons à une valeur int
* Nous n'avons pas besoins des autres structures de l'union
*/
resultat = semctl(id_sem,0,SETVAL,valeur);
return resultat;
/* Si resultat vaut -1 c'est qu'il y eu echec
* On peut recuperer errno pour savoir les raisons de cet echec
*/
}
/*------------------------------------------------------
* Paramètres:
* id_sem :ID du sémaphore
* Seul le Propriétaire ou superutilisateur du semaphore a la possibilité de
* le detruire.
*/
int destruction_sem(int id_sem)
{
int resultat =0;
resultat = semctl(id_sem,0,IPC_RMID);
return resultat;
} |
Partager