#include <stdlib.h> #include <assert.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdarg.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include "sema.h" typedef unsigned short int ushort; int creat_sem(key_t cle,int val) { int semid; union semun{ int val; struct semid_ds *buf; ushort *array; } arg; if((semid=semget(cle,1,0666+IPC_CREAT+IPC_EXCL))>= 0) { arg.val=val; if(semctl(semid,0,SETVAL,arg)< 0) semid = -1; } return(semid); } int del_sem(key_t cle) { return(semctl((semget(cle,0,0)),0,IPC_RMID,0)); } int open_sem(key_t cle) { return(semget(cle,0,0)); } void P(int semid) { struct sembuf psembuf; psembuf.sem_op = -1; psembuf.sem_flg = 0; psembuf.sem_num = 0; semop(semid,&psembuf,1); } void V(int semid) { struct sembuf vsembuf; vsembuf.sem_op = 1; vsembuf.sem_flg = 0; vsembuf.sem_num = 0; semop(semid,&vsembuf,1); }