Skip to content

Instantly share code, notes, and snippets.

@saya-rbt
Last active October 18, 2019 13:41
Show Gist options
  • Save saya-rbt/90ae0dcab811e45fe2b3c298b1f9e22d to your computer and use it in GitHub Desktop.
Save saya-rbt/90ae0dcab811e45fe2b3c298b1f9e22d to your computer and use it in GitHub Desktop.
Dijkstra semaphores implementation in C

Dijkstra semaphores in C

Usage

#include "dijkstra_sem.h"

dijkstra_sem.c

#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");
}

dijkstra_sem.h

#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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment