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

📄 philo.c

📁 经典unix问题 哲学家问题 请多多指教
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <unistd.h>
#include "ourhdr.h"
#define N		 5
#define LEFT	 (i+N-1)%N
#define RIGHT	 (i+1)%N
#define THINKING	 0
#define HUNGRY	 1
#define EATING	 2
#define TRUE 1
void philosopher(int i);
void takechopsticks(int i);
void putchopsticks(int i);
void test(int i);
void think(void);
void eat(void);
void down(int sid);
void up(int sid);
int *state;
int mutex=1;
int s[N];
int
main(void)
{
 int k=0,i=0,shmid;
 key_t key,sk;
 key_t pkey[5];
 pid_t pid;
 char p[20]="ourhdr.h\0";
 printf("it");
 //sk=ftok(p,8);
 shmid=shmget(IPC_PRIVATE, 5*sizeof(int), 384);
 state=(int *)shmat(shmid,NULL,0);
 printf("it");
 for(k=0;k<N;k++){
 	state[k]=THINKING;
 	}
 for(k=0;k<N;k++){
 	s[k]=k+2;
 	}
 key=ftok(p,mutex);
 for(k=0;k<N;k++){
 	pkey[k]=ftok(p,s[k]);
 	}
 mutex=semget(key,1,384);
 for(k=0;k<N;k++){
 	s[k]=semget(pkey[k],1,384);
 	}
 for(k=0;k<N;k++){
 	if((pid=fork())<0)return(-1);
 	else if(pid==0)philosopher(k); 
      } 
 while(TRUE){
 sleep(3);
  for(i=0;i<N;i++){
  printf("state %d is %d\n",i,state[i]);
  }
 printf("\n");
 }	

 
 return(0);
}
void philosopher(int i)
{   
	while(TRUE){
  think();
	takechopsticks(i);
  eat();
	putchopsticks(i);
	}
}
void takechopsticks(int i)
{
   down(mutex);
   state[i]=HUNGRY; test(i);
   up(mutex);
   down(s[i]);
}
void putchopsticks(int i)
{
   down(mutex);
   state[i]=THINKING;
   test(LEFT); test(RIGHT);
   up(mutex);
}
void test(i)
{
   if(state[i]==HUNGRY &&state[LEFT]!=EATING&&state[RIGHT]!=EATING){
      state[i]=EATING;up(s[i]);
   }
}
void down(int sid)
{
   struct sembuf op;
   op.sem_num=0;
   op.sem_op=-1;
   op.sem_flg=0;
   semop(sid, &op, 1);
}
void up(int sid)
{
   struct sembuf op;
   op.sem_num=0;
   op.sem_op=1;
   op.sem_flg=0;
   semop(sid, &op, 1);
}


void think()
{
 int s;
 srand((int)time(0));
 s=(int)(10.0*rand()/(RAND_MAX+1.0));
 sleep(s); 	
}
void eat()
{
 int s;
 srand((int)time(0));
 s=(int)(5.0*rand()/(RAND_MAX+1.0));
 sleep(s);
}

⌨️ 快捷键说明

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