Files
sp-lab/1.c
T
2026-05-14 00:24:19 +05:30

82 lines
1.7 KiB
C

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/wait.h>
#include<semaphore.h>
#include<sys/shm.h>
#include<fcntl.h>
#define BUFFER_SIZE 5
struct shared{
int buffer[BUFFER_SIZE];
int in;
int out;
};
int main(){
int n;
printf("\nhow many items to produce? ");
scanf("%d", &n);
int shmid = shmget(IPC_PRIVATE, sizeof(struct shared), IPC_CREAT | 0666);
struct shared* s = (struct shared* )shmat(shmid, NULL, 0);
s->in = 0;
s->out = 0;
sem_unlink("/mutex");
sem_unlink("/empty");
sem_unlink("/full");
sem_t *mutex = sem_open("/mutex", O_CREAT, 0644, 1);
sem_t *empty = sem_open("/empty", O_CREAT, 0644, BUFFER_SIZE);
sem_t *full = sem_open("/full", O_CREAT, 0644, 0);
if(fork()==0){
for(int i =1;i<=n;i++){
sem_wait(empty);
sem_wait(mutex);
s->buffer[s->in] = i;
printf("produced: %d slot: %d\n", i, s->in);
s->in = (s->in+1)%BUFFER_SIZE;
sem_post(mutex);
sem_post(full);
sleep(1);
}
exit(0);
}
if(fork()==0){
for(int i =1;i<=n;i++){
sem_wait(full);
sem_wait(mutex);
int item = s->buffer[s->out];
printf("consumed: %d slot: %d\n", item, s->out);
s->out = (s->out+1)%BUFFER_SIZE;
sem_post(mutex);
sem_post(empty);
sleep(2);
}
exit(0);
}
wait(NULL);
wait(NULL);
shmdt(s);
shmctl(shmid, IPC_RMID, NULL);
sem_unlink("/mutex");
sem_unlink("/empty");
sem_unlink("/full");
return 0;
}