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