H. Semaphore in Unix Using C Programming

Semaphore Producer Example

/*Semaphore Producer Example In C
producer.c*/

#include<stdio.h>
#include<sys/types.h>
#include<sys/sem.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<fcntl.h>
#define KEY 1010
union semun {
 int val;
 struct semid_ds *buf;
 unsigned short *array;
 struct seminfo *__buf;
};

void main() {
 int semid, count = 0, fd;
 struct sembuf put, get;
 union semun u;
 unsigned a[2] = {1, 0};
 semid = semget(KEY, 2, IPC_CREAT | IPC_EXCL | 0666);
 u.array = a;
 semctl(semid, 0, SETALL, u);
 fd = open("buff", O_CREAT | O_RDWR, 0666);
 write(fd, &count, sizeof (int));
 while (1) {
   put.sem_num = 0;
   put.sem_op = -1;
   put.sem_flg = 0;
   semop(semid, &put, 1);
   lseek(fd, 0, 0);
   read(fd, &count, sizeof (int));
   count++;
   lseek(fd, 0, 0);
   write(fd, &count, sizeof (int));
   printf("Produced item: %d\n", count);
   get.sem_num = 1;
   get.sem_op = 1;
   get.sem_flg = 0;
   semop(semid, &get, 1);
   sleep(5);
 }
 close(fd);
}

Semaphore Consumer Example

/*Semaphore Consumer Example In C
consumer.c*/

#include<stdio.h>
#include<sys/types.h>
#include<sys/sem.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<fcntl.h>
#define KEY 1010
union semun {
 int val;
 struct semid_ds *buf;
 unsigned short *array;
 struct seminfo *__buf;
};

void main() {
 int semid, count, fd;
 struct sembuf put, get;
 semid = semget(KEY, 0, 0);
 fd = open("buff", O_RDONLY);
 while (1) {
   get.sem_num = 1;
   get.sem_op = -1;
   get.sem_flg = 0;
   semop(semid, &put, 1);
   lseek(fd, 0, 0);
   read(fd, &count, sizeof (int));
   printf("Consumed item: %d\n", count);
   put.sem_num = 0;
   put.sem_op = 1;
   put.sem_flg = 0;
   semop(semid, &put, 1);
   sleep(5);
 }
 close(fd);
}

Sample Output

[09mcr110@localhost semaphore]$ ./prod
Produced item: 1
Produced item: 2
Produced item: 3
Produced item: 4
Produced item: 5
Produced item: 6
Produced item: 7
Produced item: 8
Produced item: 9
Produced item: 10
Produced item: 11
Produced item: 12
[09mcr110@localhost semaphore]$ ./cons
Consumed item: 1
Consumed item: 2
Consumed item: 3
Consumed item: 4
Consumed item: 5
Consumed item: 6
Consumed item: 7
Consumed item: 8
Consumed item: 9
Consumed item: 10
Consumed item: 11