首页 > 代码库 > 操作系统课程设计--Linux平台哲学家问题
操作系统课程设计--Linux平台哲学家问题
哲学家问题是操作系统中资源分配的经典问题
linux平台下的系统api不同于Windows下的实现
要求:一个正确的哲学家程序(不会发生死锁)
一个错误的哲学家程序(会发生死锁)
系统环境:ElementaryOS
wrong.c
#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/types.h>#include<unistd.h>#include<errno.h>#include<sys/ipc.h>#include<sys/sem.h>#include<sys/wait.h>#define DELAY (rand() % 5 + 1)#define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while(0)union semun{ int val; // Value for SETVAL struct semid_ds *buf; //Buffer for IPC_STAT, IPC_SET unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO (Linux-specific) */};//semid ! this is the number of share memoryint semid;//waiting for fork here//left and right = the number of soursesvoid wait_for_1fork(int no) { int left = no; //system defined struct //"first":the current number of pro //"second":resourses -1:wait cannot use;+1:can use //"thired":? struct sembuf buf[1] = { {left, -1, 0}, }; //semop do wait or signal (p/v) //"first": the number of share memory pro //"second":the first point of struct //"third":the number of signal to complete semop(semid, buf, 1);}void wait_for_2fork(int no) { int right = (no + 1) % 5; //system defined struct //"first":the current number of pro //"second":resourses -1:wait cannot use;+1:can use //"thired":? struct sembuf buf[1] = { {right, -1, 0} }; //semop do wait or signal (p/v) //"first": the number of share memory pro //"second":the first point of struct //"third":the number of signal to complete semop(semid, buf, 1);}void free_1fork(int no){ int left = no; //system defined struct //"first":the current number of pro //"second":resourses -1:wait cannot use;+1:can use //"thired":? struct sembuf buf[1] = { {left, 1, 0}, }; semop(semid, buf, 1);}void free_2fork(int no){ int right = (no + 1) % 5; //system defined struct //"first":the current number of pro //"second":resourses -1:wait cannot use;+1:can use //"thired":? struct sembuf buf[1] = { {right, 1, 0} }; semop(semid, buf, 1);}void philosopere(int num){ srand(getpid()); for (; ;) { //printf("%d is thinking\n", num); printf("\033[36m%d is thinking\n\033[0m", num); if(num!=0) sleep(DELAY); //printf("%d is hungry\n", num); wait_for_1fork(num); //printf("%d pick up left chopsticks\n", num); printf("\033[31m%d pick up left chopsticks\n\033[0m", num); sleep(DELAY); sleep(DELAY); wait_for_2fork(num); //printf("%d pick up right chopsticks\n", num); printf("\033[34m%d pick up right chopsticks\n\033[0m", num); //printf("%d is eating\n", num); sleep(DELAY); free_1fork(num); //printf("%d return left chopsticks\n", num); printf("\033[33m%d return left chopsticks\n\033[0m", num); sleep(DELAY); free_2fork(num); //printf("%d return right chopsticks\n", num); printf("\033[37m%d return right chopsticks\n\033[0m", num); }}int main(){ //use IPC to connect between processes . A new share memory //semget() return the number of share memory //new signal key=0 and never change .So not use key //"first":use IPC_PRIVATE to share memory between relation processes //"second":(size_t)naxSize //"third":(int flag)private:666--read and write ; IPC_CREAT creat new memory semid = semget(IPC_PRIVATE, 5, IPC_CREAT | 0666); if (semid == -1) ERR_EXIT("semget"); union semun su; su.val = 1; for (int i = 0; i < 5; i++) { //creat a new object on "semid" //use i to depart 5 processes semctl(semid, i, SETVAL, su); } int no = 0; //pid_t (Process ID _ Type) Just like int pid_t pid; for (int i = 1; i < 5; i++) { //use fork() to make a copy of father process named with child pro //father.pid>0 and child.pid=0 //after for loop will exist a father and five childs(0-4) pid = fork(); if (pid == -1) ERR_EXIT("fork"); if (pid == 0) { no = i; //break the child process loop to run the philosopere break; } } philosopere(no); return 0;}
right.c
#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/types.h>#include<unistd.h>#include<errno.h>#include<sys/ipc.h>#include<sys/sem.h>#include<sys/wait.h>#define DELAY (rand() % 5 + 1)#define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while(0)union semun{ int val; // Value for SETVAL struct semid_ds *buf; //Buffer for IPC_STAT, IPC_SET unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO (Linux-specific) */};//semid ! this is the number of share memoryint semid;//waiting for fork here//left and right = the number of soursesvoid wait_for_2fork(int no) { int left = no; int right = (no + 1) % 5; //system defined struct //"first":the current number of pro //"second":resourses -1:wait cannot use;+1:can use //"thired":? struct sembuf buf[2] = { {left, -1, 0}, {right, -1, 0} }; //semop do wait or signal (p/v) //"first": the number of share memory pro //"second":the first point of struct //"third":the number of signal to complete semop(semid, buf, 2);}void free_2fork(int no){ int left = no; int right = (no + 1) % 5; //system defined struct //"first":the current number of pro //"second":resourses -1:wait cannot use;+1:can use //"thired":? struct sembuf buf[2] = { {left, 1, 0}, {right, 1, 0} }; semop(semid, buf, 2);}void philosopere(int num){ srand(getpid()); for (; ;) { //printf("\033[31m Hello\n\033[0m"); //printf("\033[36m Hello\n\033[0m"); //printf("\%d is thinking\n", num); printf("\033[31m%d is thinking\n\033[0m", num); sleep(DELAY); printf("%d pick up two chopsticks\n", num); printf("\033[36m%d pick up two chopsticks\n\033[0m", num); wait_for_2fork(num); //printf("%d is eating\n", num); printf("\033[34m%d is eating\n\033[0m", num); sleep(DELAY); free_2fork(num); }}int main(){ //use IPC to connect between processes . A new share memory //semget() return the number of share memory //new signal key=0 and never change .So not use key //"first":use IPC_PRIVATE to share memory between relation processes //"second":(size_t)naxSize //"third":(int flag)private:666--read and write ; IPC_CREAT creat new memory semid = semget(IPC_PRIVATE, 5, IPC_CREAT | 0666); if (semid == -1) ERR_EXIT("semget"); union semun su; su.val = 1; for (int i = 0; i < 5; i++) { //creat a new object on "semid" //use i to depart 5 processes semctl(semid, i, SETVAL, su); } int no = 0; //pid_t (Process ID _ Type) Just like int pid_t pid; for (int i = 1; i < 5; i++) { //use fork() to make a copy of father process named with child pro //father.pid>0 and child.pid=0 //after for loop will exist a father and five childs(0-4) pid = fork(); if (pid == -1) ERR_EXIT("fork"); if (pid == 0) { no = i; //break the child process loop to run the philosopere break; } } philosopere(no); return 0;}
操作系统课程设计--Linux平台哲学家问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。