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

📄 philosopher.c

📁 假如所有的哲学家都同时拿起左侧叉子
💻 C
字号:
#include "sys/types.h"
#include "sys/stat.h"
#include "dirent.h"
#include "limits.h"
#include "ourhdr.h"
#include "unistd.h"
#include "fcntl.h"
#include "error.c"
# define N 5 /* 哲学家数目 */
# define LEFT (i-1+N)%N /* i的左邻号码 */
# define RIGHT i /* i的右邻号码 */
//# define TRUE 1
int time;
void eat(int i);		//吃饭
void think(int i);		//思考
void philosopher(int i);		//哲学家函数	
void take_forks(int i);			//拿叉子
void put_forks(int i);			//放下叉子
char *file(int i);				
void down(int i,const char *filename);		//i号哲学家创建需要的文件
void up(const char *filename);				//i号哲学家删除使用完了的文件
int main(int argc,char *argv[])	
{
	unlink("1");			//删除上一次可能残留的文件
	unlink("2");
	unlink("3");
	unlink("4");
	unlink("0");
	int i;
	pid_t pid; 
	if(argc==1)				//缺省实际为2秒	
		time=2;	
	else{
		if(strcmp(argv[1],"-t")!=0){			//若输入格式不符合要求则提示出错
			printf("input format error!\n");
			return;
		}	
		else
			time=atoi(argv[2]);					//转化输入字符串为数字
	}
	for(i=0;i<N;i++){
		if((pid=fork())<0)						//生成5个子进程代表5个哲学家
			err_sys("fork error!");
			else if(pid==0)						//child执行哲学家函数 
				philosopher(i);
		}
	wait(0);									//parent等待
}	


void philosopher(int i)							//i:哲学家号码,从0到N-1 
{
	while(1)
	{											// 无限循环
		think(i);								// 哲学家正在思考 
		take_forks(i);							// 拿两只叉子
		eat(i);									// 进餐 
		put_forks(i);							// 放回两把叉子 
	}
}
void down(int i,const char *filename)
{
	int	fd;
	while ( (fd = open(filename, O_RDONLY | O_CREAT | O_EXCL,FILE_MODE)) < 0)
		;										//若无法创建所需文件则一直等待
	close(fd);
}
void up(const char *filename)
{
	unlink( filename ) ;						//删除文件
}

void take_forks(int i)							//取叉子
{
	if(i%2==0){									//偶数号哲学家先取右边叉子再取左边叉子
		down(i,file(RIGHT));	
		down(i,file(LEFT));
	}
	else{										//奇数号哲学家先取左边叉子再取右边叉子
		down(i,file(LEFT));
		down(i,file(RIGHT));
	}
	return ;
}
void put_forks(int i)							//放下叉子
{
	if(i%2==0){									//偶数号哲学家先放右边再放左边叉子
		up(file(RIGHT));				
		up(file(LEFT));
	}
	else{										//奇数号哲学家先放左边再放右边叉子
		up(file(LEFT));
		up(file(RIGHT));
	}
	return;
}
char *file(int i)								//创建i所对应的文件号
{
	switch(i){
	case 0:
		return "0";
		break;
	case 1:
		return "1";
		break;
	case 2:
		return "2";
		break;
	case 3:
		return "3";
		break;
	case 4:
		return "4";
		break;
	default:
		break;
	}
}
void think(int i)							//思考time的时间
{
	printf("philosopher %d is thinking.\n",i);
	sleep(time);
	return;
}
void eat(int i)								//吃time的时间
{
	printf("philosopher %d is eating.\n",i);
	sleep(time);
	return;
}



⌨️ 快捷键说明

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