⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 philsophy.c

📁 哲学家就餐问题例子
💻 C
字号:
#include<sys/ipc.h>#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/sem.h>#include<signal.h>#include<unistd.h>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);}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -