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