Unix课程设计实验四 编制模拟“五个哲学家”问题的程序(进程同步)

                                                        实验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,那么就删除该文件的内容

 

你可能感兴趣的:(linux,unix应用)