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

📄 哲学家问题.c

📁 哲学家问题的简单实现
💻 C
字号:
#include        "ourhdr.h"
#include        <unistd.h>
#include        <sys/stat.h>
int num;
#define         N       5
#include        <fcntl.h>
#include        <sys/types.h>
#define LEFT    (i) % num
#define RIGHT   (i + 1) % num
#include        <sys/types.h>
void down(int);
void up(int);
void initforks();
void put_fork(int);
void take_fork(int);
char **list;
void think(int i)
{
        printf("Philosopher %d is thinking\n", i);
        sleep(2);
}
void eat(int i)
{       printf("Philosopher %d is eating\n", i);
        sleep(2);
}

void take_fork(int i)
{
        if(i != 0) {
                down(LEFT);
                down(RIGHT);
        }
        else {
                down(RIGHT);
                down(LEFT);
        }
}

void put_fork(int i)
{
        if(i != 0) {
                up(LEFT);
                up(RIGHT);
        }
        else {
                up(RIGHT);
 		up(LEFT);
        }
}

void philosopher(int i)
{
        while(1) {
                think(i);
                take_fork(i);
                eat(i);
                put_fork(i);

                }
}
int num;
main(int argc,char *argv[])
{
        int     i;
        pid_t   pid;
        if(argc>1)
        num=atoi(argv[1]);
        else num=N;
 initforks();

        for(i = 0; i < num; i++) {
                if( (pid = fork()) < 0)
                        err_sys("fork error");
                if(pid == 0) {
                        philosopher(i);
                        exit(1);
                }
        }

        wait(0);
        exit(1);
}


void down(int i)
{
        int     fd;

        while( (fd = open(list[i], O_RDONLY | O_CREAT | O_EXCL, FILE_MODE)) < 0
)
 close(fd);
}

void up(int i)
{
        unlink(list[i]);
}
 void initforks()

{       int i;

         list = (char **)malloc(sizeof(char *)*num);

         for(i=0;i<num;i++)
        {
        list[i] = (char *)malloc(sizeof(char *)*num);
        list[i][0]='0'+i; list[i][1]=(char)0;
        up(i);
}
}

⌨️ 快捷键说明

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