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
|
/* fichier dijkstra.h */
/* Implementation des semaphores de Dijkstra a l'aide des semaphores
* de SystemV.
*
* sem_create(): creation d'un semaphore
* P() : realisation de l'operation P sur un semaphore
* V() : realisation de l'operation V sur un semaphore
* sem_delete() : suppression d'un semaphore
*/
int sem_create(cle, initval) /* creation d'un semaphore relie a cle */
/* de valeur initiale initval */
key_t cle ;
int initval ;
{
int semid ;
union semun {
int val ;
struct semid_ds *buf ;
ushort *array ;
} arg_ctl ;
semid = semget(ftok("dijkstra.h",cle),1,IPC_CREAT|IPC_EXCL|0666) ;
if (semid == -1) {
semid = semget(ftok("dijkstra.h",cle),1, 0666) ;
if (semid == -1) {
perror("Erreur semget()") ;
exit(1) ;
}
}
arg_ctl.val = initval ;
if (semctl(semid,0,SETVAL,arg_ctl) == -1) {
perror("Erreur initialisation semaphore") ;
exit(1) ;
}
return(semid) ;
}
void P(semid)
int semid ;
{
struct sembuf sempar ;
sempar.sem_num = 0 ;
sempar.sem_op = -1 ;
sempar.sem_flg = SEM_UNDO ;
if (semop(semid, &sempar, 1) == -1)
perror("Erreur operation P") ;
}
void V(semid)
int semid ;
{
struct sembuf sempar ;
sempar.sem_num = 0 ;
sempar.sem_op = 1 ;
sempar.sem_flg = SEM_UNDO ;
if (semop(semid, &sempar, 1) == -1)
perror("Erreur operation V") ;
}
void sem_delete(semid)
int semid ;
{
if (semctl(semid,0,IPC_RMID,0) == -1)
perror("Erreur dans destruction semaphore");
}
//tab de semaphore
int tab[5]:
for (i=0;i<(taille);i++)
{
tab[i]= sem_create(i,1) ;
printf("creation du semaphore s_tab_nc [%d]= %d \n",i,s_tab_nc[i]);
} |
Partager