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);} } }