rendered paste body#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/wait.h>#include <stddef.h>#include <stdio.h>int main () { struct sembuf Wait[5] = { {0,-1,SEM_UNDO}, {1,-1,SEM_UNDO},{2,-1,SEM_UNDO}, {3,-1,SEM_UNDO},{4,-1,SEM_UNDO}}; struct sembuf Signal[5] = { {0,1,SEM_UNDO}, {1,1,SEM_UNDO},{2,1,SEM_UNDO}, {3,1,SEM_UNDO},{4,1,SEM_UNDO}}; int ch, i, pid; key_t mykey; int semid; union wait waitstatus; struct sembuf OpList[2]; mykey = ftok("./a.out",'a'); semid = semget(mykey, 5, IPC_CREAT | 0600 ); semctl(semid,0,SETVAL,1); semctl(semid,1,SETVAL,1); semctl(semid,2,SETVAL,1); semctl(semid,3,SETVAL,1); semctl(semid,4,SETVAL,1); if (fork()==0) { /* child */ OpList[0] = Wait[0]; OpList[1] = Wait[1]; printf("Waiting\n"); semop(semid,OpList,2); printf("Unlocked\n"); } else { /* parent*/ sleep(3); OpList[0] = Signal[0]; OpList[1] = Signal[1]; semop(semid,OpList,2); wait3(&ch,0,NULL); } for (i = 0 ; i < 5 ; i++ ) { pid = fork(); if (pid == 0) break; } if (pid == 0) { pid = getpid(); /* do the philosopher thing */ int N = 0; while(N<5){ if(N==5){ OpList[0] = Wait[i]; OpList[1] = Wait[0]; semop(semid, OpList,2); printf("Philosopher %d eating with fork %d %d\n", pid,i, i+1); sleep(1); OpList[0] = Signal[i]; OpList[1] = Signal[0]; semop(semid, OpList,2); printf("Philosopher %d thinking\n", pid); sleep(4); N++; } else{ OpList[0] = Wait[i]; OpList[1] = Wait[i+1]; semop(semid, OpList,2); printf("Philosopher %d eating with fork %d %d\n", pid,i, i+1); sleep(1); OpList[0] = Signal[i]; OpList[1] = Signal[i+1]; semop(semid, OpList,2); printf("Philosopher %d thinking\n", pid); sleep(4); N++;}} return 0; } else { for (i = 0 ; i < 5 ; i++){ wait3(&ch,0,NULL); } /* remove the semaphore */ return 0; }}