实验4 编制模拟“五个哲学家”问题的程序
一、实验目的:
学习和掌握并发进程同步的概念和方法。
二、实验要求:
1、程序语法
philosopher [ -t
2、五个哲学家的编号为0~4,分别用五个进程独立模拟。
3、程序的输出要简洁,仅输出每个哲学家进餐和沉思的信息。例如,当编号为3的哲学家在进餐时,就打印:
philosopher 3 iseating
而当他在沉思时,则打印:
philosopher3 is thinking
除此之外不要输出其他任何信息。
4、利用课堂已教授的知识而不使用线程或IPC机制进行同步。
5、程序应该一直运行,直到人为地终止它(按Ctrl-C或Ctrl-\)。不允许出现僵尸进程。
三、实验过程:
用for循环和fork函数生成5个哲学家进程,如果是前4个哲学家,思考
四、实验程序:
#include "apue.h"
#include
#include
#include "lock.h"
#include
int
main(int argc,char *argv[])
{
pid_t pid[5];//5个哲学家进程
int i,fd,time;
char*filename[]={"file0","file1","file2","file3","file4"};//定义5把叉子
if(argc==1)
time=2;//时间缺省值
elseif(argc==3&&strcmp("-t",argv[1])==0)
time=atoi(argv[2]);
else err_sys("Inputerror");
for(i=0;i<5;i++)
initlock(filename[i]);
for(i=0;i<5;i++)
{
pid[i]=fork();
if(pid[i]==0)
{
while(1)
{
if(i==4)//最后一个哲学家使用第4把叉子和第0把叉子
{
printf("philosopher 4 isthinking\n");
sleep(time);
lock(filename[0]);
lock(filename[4]);
printf("philosopher 4is eating\n");
sleep(time);
unlock(filename[4]);
unlock(filename[0]);
}
else
{
printf("philosopher%d is thinking\n",i);
sleep(time);
lock(filename[i]);
lock(filename[i+1]);
printf("philosopher%d is eating\n",i);
sleep(time);
unlock(filename[i]);
unlock(filename[i+1]);
}
}
}
}
for(i=0;i<5;i++)
{
if(waitpid(pid[i],NULL,0)!=pid[i])
err_sys("waitpiderror");
}
exit(0);
}
五、实验结果:
用gcc philosopher.c error2e.clock.c -ophilosopher编译生成可执行文件,命令行只有一个参数philosopher时,每过2秒就能确定下个哲学家的状态,运行结果如下:(Ctrl + C或者ctrl + \ 结束)
命令行有三个参数时,每过5秒就能确定下个哲学家的状态.
运行程序如下:(Ctrl + C或者ctrl + \ 结束)
① 实验总结
a. open(file, O_RDONLY | O_CREAT | O_EXCL,FILE_MODE)
如果同时指定了O_CREAT,而文件已经存在,则会出错。可以测试一个文件是否存在,如果不存在则创建此文件。
b. int unlink(const char *pathname)
此函数删除目录项,并将由pathname所应用文件的链接计数减1.内核检查其链接数,如果为0,那么就删除该文件的内容