?? 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 + -