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

📄 philosopher0.c

📁 linux进程间通信
💻 C
字号:
#include<stdio.h>#include<sys/types.h>#include<linux/sem.h>#include<stdlib.h>#define N 5#define TURE 1#define LEFT (i+4)%N#define RIGHT  (i+1)%N#define THINKING 0#define HUNGRY  1#define EATING  2int main (){		int i;	pid_t pid;	int semid;	int nsems=2*N+1;	int flags=0666;	union semun t;	semid=semget(IPC_PRIVATE,nsems,flags);	if(semid<0)        {                perror("semget");                exit(-1);        }	i=1;	t.val=0;	while(i<N+6)	{		semctl(semid,i,SETVAL,t);i++;	}	t.val=1;	semctl(semid,0,SETVAL,t);	i=0;	while(i<N)	{		if((pid=fork())<0)		{			printf("Fork()Error\n");			exit(-1);		}		else if(pid==0)		{			printf("zijincheng %d ",i);			philosopher(i,semid);exit(1);					}		else		{	printf("fujicheng %d ",i);		}		i++;	}	return 0;}int think(int i){	int s=rand()%11;	switch(s)	{			case 0:sleep(10);break;		case 1:sleep(20);break;		case 2:sleep(12);break;		case 3:sleep(16);break;		case 4:sleep(7);break;		case 5:sleep(15);break;		case 6:sleep(2);break;		case 7:sleep(8);break;		case 8:sleep(22);break;		case 9:sleep(5);break;		//case 10:delay(1000);break;		default:sleep(12);	}	printf("philosopher %d is thinking!\n",i);	return 1;}void eat(int i){	printf("philosopher %d is eating!\n",i);	sleep(5);}void take_fork(int i,int semid){		struct sembuf buf;	union semun t;	buf.sem_num=0;	buf.sem_op=-1;	buf.sem_flg=0;	semop(semid,&buf,1);            //p(m)	//printf("%d",semctl(semid,0,GETVAL));	/*buf.sem_num=N+1+i;	buf.sem_op=1;	buf.sem_flg=0;	semop(semid,&buf,1);*/	t.val=HUNGRY;	semctl(semid,N+1+i,SETVAL,t);           //state[i]=HUNGRY;	//printf("%d",semctl(semid,N+1+i,GETVAL));	test(i,semid);		buf.sem_num=0;        buf.sem_op=1;        buf.sem_flg=0;        semop(semid,&buf,1);             //v(m)    	//printf("%d",semctl(semid,0,GETVAL));	buf.sem_num=1+i;        buf.sem_op=1;        buf.sem_flg=0;        semop(semid,&buf,1);               //p(s[i])	//printf("%d",semctl(semid,1+i,GETVAL));}void put_fork(int i,int semid){		struct sembuf buf;	union semun t;        buf.sem_num=0;        buf.sem_op=-1;        buf.sem_flg=0;        semop(semid,&buf,1);            //p(m)       /* buf.sem_num=N+1+i;        buf.sem_op=-2;        buf.sem_flg=0;	semop(semid,&buf,1);*/	t.val=THINKING;	semop(semid,N+1+i,SETVAL,t);       //state[i]=THINKING;	test(LEFT,semid);	test(RIGHT,semid);	buf.sem_num=0;        buf.sem_op=1;        buf.sem_flg=0;        semop(semid,&buf,1);             //v(m)}int test(int i,int semid){		int l,r,o;	struct sembuf buf;	union semun t;	o=semctl(semid,N+1+i,GETVAL);	l=semctl(semid,N+1+LEFT,GETVAL);	r=semctl(semid,N+1+RIGHT,GETVAL);		if(o==HUNGRY && l!=EATING && r!=EATING)	{		/*buf.sem_num=N+1+i;        	buf.sem_op=1;        	buf.sem_flg=0;        	semop(semid,&buf,1);*/		t.val=EATING;          //state[i]=EATING;		semctl(semid,N+1+i,SETVAL,t);		buf.sem_num=1+i;                buf.sem_op=1;                buf.sem_flg=0;                semop(semid,&buf,1);                          // v(s);	}	return 1;	}int philosopher (int i,int semid){	while (TURE)	{		think(i);		take_fork(i,semid);		eat(i);		put_fork(i,semid);	}		return 1;	}

⌨️ 快捷键说明

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