#include #include #include #include #include #include #include #include #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; }