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

📄 philosopher.c

📁 在unix下实现同步与异步write的效率比较
💻 C
字号:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include"apue.h"

enum state{eat,think};
int count=0;
int time=2;

struct person{
 int id;
 int pid;
 int sta;
}pho[5];
int pid[5];

void print(int id,int i){
    if(i==0)printf("The %dphilosopher is eating;\n",id+1);
    if(i==1)printf("The %dphilosopher is thinking;\n",id+1);
}

char *file[5]={"chopstick1.c","chopstick2.c","chopstick3.c","chopstick4.c","chopstick5.c"};

void chopstick(void){
    int i;
    int fd;
    for(i=0;i<5;i++)
       unlink(file[i]);
}

void EatOrThink(int id){
    int i,j;
    int fd;
    while(1){
      if(id%2==0){
        i=(id)%5;
        if((fd=open(file[i],O_RDONLY|O_CREAT|O_EXCL,FILE_MODE))<0){ 
           pho[id].sta=think;
           print(id,think);
	   sleep(time);
        }
        else{
           j=(id+1)%5;
	   if((fd=open(file[j],O_RDONLY|O_CREAT|O_EXCL,FILE_MODE))<0){
	     unlink(file[i]);
	     pho[id].sta=think;
	     print(id,think); 
	     sleep(time);
	   }
           else {
             pho[id].sta=eat;
             print(id,eat); 
	     sleep(time);
               unlink(file[j]);
	       unlink(file[i]);
               sleep(time);
           }
        }
     }  
     else{
       j=(id+1)%5;
       if((fd=open(file[j],O_RDONLY|O_CREAT|O_EXCL,FILE_MODE))<0){
	 pho[id].sta=think;
         print(id,think); 
	 sleep(time);
       }
       else{
         i=(id)%5;
         if((fd=open(file[i],O_RDONLY|O_CREAT|O_EXCL,FILE_MODE))<0){ 
           unlink(file[j]);
	   pho[id].sta=think;
	   print(id,think); 
	   sleep(time);
	 }
         else{
           pho[id].sta=eat;
           print(id,eat); 
 	   sleep(time);
           unlink(file[i]);
 	   unlink(file[j]);
           sleep(time);
         }
       }
     }
   }
}

int main(int argc,char *argv[]){

  if(argc==3){
    time=atoi(argv[2]);
    printf("time=%d\n",time);
  }
  else printf("format:philosopher  [ -t  <time> ]\n");
  chopstick();

  if((pid[0]=fork())<0) 
    err_sys("wait error");
  else if(pid[0]==0){
         pho[0].id=0;
         pho[0].pid=getpid();
         pho[0].sta=think;  
         EatOrThink(pho[0].id);
       }     
 
  if((pid[1]=fork())<0) 
    err_sys("wait error");
  else if(pid[1]==0){
         pho[1].id=1;
         pho[1].pid=getpid();
         pho[1].sta=think; 
         EatOrThink(pho[1].id);
       }
 
  if((pid[2]=fork())<0) 
    err_sys("wait error");
  else if(pid[2]==0){
         pho[2].id=2;
         pho[2].pid=getpid();
         pho[2].sta=think;
         EatOrThink(pho[2].id);
       }
 
  if((pid[3]=fork())<0) 
    err_sys("wait error");
  else if(pid[3]==0){
         pho[3].id=3;
         pho[3].pid=getpid();
         pho[3].sta=think; 
         EatOrThink(pho[3].id);
       }

  if((pid[4]=fork())<0) 
    err_sys("wait error"); 
  else if(pid[4]==0){
         pho[4].id=4;
         pho[4].pid=getpid();
         pho[4].sta=think;  
         EatOrThink(pho[4].id);
       }
  wait(NULL);
}

⌨️ 快捷键说明

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