All pastes #951694 Raw Edit

Stuff

public c v1 · immutable
·published 2008-03-21 16:27 UTC
rendered paste body
/* You need to switch from 2 to 5 semaphores.   Initialize the 5 semaphores to unlocked.   You still only need two semaphores in the OpList.*/#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}};  //Signal for 5 philosophers  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[i%5];	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%5];		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;  }}