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