📄 philsophy.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 + -