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 () {int ii; 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 ii = 0; for (ii = 0 ; ii < 5 ; ii++ ){ OpList[0] = Wait[i]; OpList[1] = Wait[(i+1)%5]; semop(semid,OpList,2); printf("philosopher %d eating using forks %d and %d \n", pid, i, (i+1)%5); sleep(1); OpList[0] = Signal[i]; OpList[1] = Signal[(i+1)%5]; semop(semid,OpList,2); printf("philosopher %d thinking\n", pid); sleep(4); } return 0; } else { for (i = 0 ; i < 5 ; i++){ wait3(&ch,0,NULL); } /* remove the semaphore */ return 0; }}