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

📄 philosopher0.c

📁 linux进程间通信
💻 C
字号:
#include<sys/ipc.h>#include<stdio.h>#include<sys/types.h>#include<sys/sem.h>#include<stdlib.h>#define N 5#define TURE 1#define LEFT (i-1)%N#define RIGHT  (i+1)%N#define THINKING 0#define HUNGRY  1#define EATING  2union semun{	int val;	struct semid_ds *buf; 	ushort *array;	struct seminfo *_buf;	void *_pad;}void 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);	i=1;	t.val=0;	while(i<N+1)	{		semctl(semid,i,SETVAL,t);i++;	}	i=N+1;	t.val=0;	while(i<N+6)	{		semctl(semid,i,SETVAL,t);i++;	}	t.val=1;	setctl(semid,0,1,t);	if(semid<0)	{		perror("semget");		exit(-1);	}	i=0;	while(i<N)	{		if((pid=fork())<0)		{			printf("Fork()Error\n");			exit(-1);		}		else if(pid==0)		{			philosopher(i);		}		else		{			wait(0);			}		i++;	}}void think(int i){	int s=rand(10);	switch(s)	{		case 1:delay(100);break;		case 2:delay(200);break;		case 3:delay(300);break;		case 4:delay(400);break;		case 5:delay(500);break;		case 6:delay(600);break;		case 7:delay(700);break;		case 8:delay(800);break;		case 9:delay(900);break;		//case 10:delay(1000);break;		default:delay(1100);	}	printf("philosopher %d is thinking!\n",i);}void eat(int i){	printf("philosopher %d is eating!\n",i);	delay(10);}void take_fork(int i){		struct sembuf buf;	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=-1;	buf.sem_flg=0;	semop(semid,&buf,1);           //state[i]=HUNGRY;	test(i);	buf.sem_num=0;        buf.sem_op=-1;        buf.sem_flg=0;        semop(semid,&buf,1);             //v(m)    	buf.sem_num=1+i;        buf.sem_op=1;        buf.sem_flg=0;        semop(semid,&buf,1);               //p(s[i])}void put_fork(int i){	struct sembuf buf;        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);       //state[i]=THINKING;	test(LEFT);	test(RIGHT);	buf.sem_num=0;        buf.sem_op=-1;        buf.sem_flg=0;        semop(semid,&buf,1);             //v(m)}void test(int i){		int l,r,o;	union semun t;	semctl(semid,N+1+i,GETVAL,t);	o=t.val;	semctl(semid,N+i,GETVAL,t);	l=t.val;	semctl(semid,N+2+i,GETVAL,t);	r=t.val;	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);                //state[i]=EATING;				buf.sem_num=1+i;                buf.sem_op=-1;                buf.sem_flg=0;                semop(semid,&buf,1);                          // v(s);	}	}int philosopher (int i){	while (TURE)	{		think(i);		take_fork(i);		take_fork((i+1)%N);		eat(i);		put_fork(i);		put_fork((i+1)%N);	}		}

⌨️ 快捷键说明

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