#include sys / types.h >
#include sys / ipc.h >
#include sys / sem.h >
union semun{
int val;
struct semid_ds * buf;
unsigned short * array;
struct seminfo * __buf;
};
// create the semaphore set,
// if key is IPC_PRIVATE, the semaphore is anonymous
int semaphore_create(key_t key, int number)
{
return semget(key, number, IPC_CREAT | IPC_EXCL | 0666 );
}
// set all semaphores to val
int semaphore_setAll( int semid, int number, int val)
{
int i;
union semun initVal;
unsigned short valList[number];
for (i = 0 ; i < number; i ++ )
{
valList[i] = val;
}
initVal.array = & valList[ 0 ];
return semctl(semid, 0 , SETALL, initVal);
}
// get all semaphores to val
int semaphore_getAll( int semid, unsigned short ** val)
{
union semun ret;
ret.array = * val;
return semctl(semid, 0 , GETALL, ret);
}
// set index-th semaphore to val
int semaphore_set( int semid, int index, int val)
{
union semun un;
un.val = val;
return semctl(semid, index, SETVAL, un);
}
// get index-th semaphore to val
int semaphore_get( int semid, int index, int * val)
{
union semun un;
un.val = * val;
return semctl(semid, index, GETVAL, un);
}
// delete the semaphore set
int semaphore_del( int semid)
{
return semctl(semid, 0 , IPC_RMID);
}
// v operation, here we just add one for example
int semaphore_v( int semid, int index)
{
// add the semaphore
struct sembuf operation;
operation.sem_num = index;
operation.sem_op = 1 ;
operation.sem_flg = SEM_UNDO;
return semop(semid, & operation, 1 );
}
// p operation, here just del one for example
int semaphore_p( int semid, int index)
{
struct sembuf operation;
operation.sem_num = index;
operation.sem_op = - 1 ;
operation.sem_flg = SEM_UNDO;
struct timespec delay;
delay.tv_sec = 2 ;
delay.tv_nsec = 0 ;
return semtimedop(semid, & operation, 1 , & delay);
}