www.pudn.com > philsophy.zip > philsophy.c


#include
#include
#include
#include
#include
#include
#include

int semid;              /*五个信号量的共同ID*/ 
void (*old_handler)(int);     
void ctrl_c(int dump)                   /*按ctrl_c退出程序*/ 
{if(semctl(semid,0,IPC_RMID)<0){perror("semctl IPC_RMID");exit(EXIT_FAILURE);}
signal(SIGINT,old_handler);
exit(0);}

int main()
{
int phi,i;
int ran;
pid_t val;
int nsems=5;
int flags=0666;
struct sembuf buf[2];
semid=semget(IPC_PRIVATE,nsems,flags);                  /*创建5个信号量 */
if(semid<0){perror("semget");exit(EXIT_FAILURE);}
/*刚创建的信号量为0,将其设为1才能用*/
for(i=0;i<5;i++){buf[0].sem_num=i;buf[0].sem_op=1;buf[0].sem_flg=IPC_NOWAIT;semop(semid,buf,1);}
val=fork();
if(val!=0){phi=1;val=fork();        /*创建5个子进程*/ 
	if(val!=0){val=fork();
		if(val!=0){val=fork();
			if(val==0)phi=5;}
		else phi=4;}
	else phi=3;}
else phi=2;
if(val!=0)old_handler=signal(SIGINT,ctrl_c);     /*为父进程重新设置退出信号*/ 
while(1){
	ran=rand()%5;
	if(phi==ran){printf("			%d is hungry,%d want to eat!\n",phi,phi);sleep(1);
		buf[0].sem_num=phi;buf[0].sem_op=-1;buf[0].sem_flg=0;           /*设置第一个信号量*/ 
		buf[1].sem_num=(phi+1)%5;buf[1].sem_op=-1;buf[1].sem_flg=0;      /*设置第二个信号量*/ 
		semop(semid,buf,2);         /*根据刚才的设置同时对两个信号量进行p操作*/ 
		printf("							%d has eaten!\n",phi);sleep(1);
		buf[0].sem_num=phi;buf[0].sem_op=1;buf[0].sem_flg=0;             /*设置第一个信号量*/
		buf[1].sem_num=(phi+1)%5;buf[1].sem_op=1;buf[1].sem_flg=0;       /*设置第二个信号量*/
		semop(semid,buf,2);}        /*根据刚才的设置同时对两个信号量进行p操作*/
	else {printf("%d is thinking!\n",phi);sleep(1);}
	}
}