#include "dijkstra_sem.h"
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/errno.h>
int sem_create(key_t key, int initval)
{
int semuid;
union semun
{
int val;
struct semid_ds *buf;
ushort *array;
} arg_ctl;
semid = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666);
if(semid == -1)
{
semid = semget(key, 1, 0666);
if(semid == -1)
perror("semget() error", exit(1));
}
else
{
arg_ctl.val = initval;
if(semctl(semid, 0, SETVAL, arg_ctl) == -1)
perror("semaphore init error", exit(1));
}
return semid;
}
void p(int semid)
{
struct sembuf sempar;
sempar.sem_num = 0;
sempar.sem_op = -1;
sempar.sem_flg = 0;
if(semop(semid, &sempar, 1) == -1)
perror("p error");
}
void v(int semid)
{
struct sembuf sempar;
sempar.sem_num = 0;
sempar.sem_op = 1;
sempar.sem_flg = 0;
if(semop(semid, &sempar, 1) == -1)
perror("v error");
}
void sem_delete(int semid)
{
if(semctl(semid, 0, IPC_RMID, 0) == -1)
perror("semaphore destruction error");
}
#ifndef DIJKSTRA_SEM_H
#define DIJKSTRA_SEM_H
int sem_create(key_t key, int initval);
void sem_delete(int semid);
void p(int semid);
void p(int semid);
#endif