必须设计餐饮哲学家计划,同时使用管道上课。在管道消息传递中遇到一些麻烦。到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define N 5
#define LEFT (i + 4) % N
#define RIGHT (i + 1) % N
#define THINKING 0
#define HUNGRY 1
#define EATING 2
sem_t spoon;
sem_t phil[N];
int state[N];
int philNum[N] = {0, 1, 2, 3, 4};
int fd[N][2];
pid_t pid, pids[N];
int i;
int num;
void philosopher(int i);
void test(int i);
void takeSpoon(int i);
void putSpoon(int i);
char buffer[100];
我很确定问题出在管道上。
int main()
{
for(i = 0; i < N; i++)
{
pipe(fd[i]);
pids[i] = fork();
printf("i = %d\n", i);
printf("pids[i] = %d\n", pids[i] );
if(pids[i] == 0)
{
dup2(fd[i][1], 1);
close(fd[i][0]);
close(fd[i][1]);
philosopher(i);
exit(0);
}
else if(pids[i] > 0)
{
dup2(fd[i][0], 0);
close(fd[i][0]);
close(fd[i][1]);
}
}
for(i = 0; i < N; i++)
{
waitpid(pids[i], NULL, 0);
}
return 0;
}
void philosopher(int i)
{
while(1)
{
sleep(1);
takeSpoon(i);
sleep(2);
putSpoon(i);
sleep(1);
}
}
试图弄清楚为什么消息传递是通过管道实现发生的。
void takeSpoon(int i)
{
sem_wait(&spoon);
state[i] = HUNGRY;
printf("Philosopher %d is hungry\n", i + 1);
test(i);
sem_post(&spoon);
sem_wait(&phil[i]);
}
void putSpoon(int i)
{
sem_wait(&spoon);
state[i] = THINKING;
printf("Philosopher %d puts downspoon %d and %d\n", i + 1, LEFT + 1, i + 1);
printf("Philosopher %d thinks\n", i + 1);
test(LEFT);
test(RIGHT);
sem_post(&spoon);
}
void test(int i)
{
if(state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING)
{
state[i] = EATING;
printf("Philosopher %d takes spoon %d and %d \n",i + 1, LEFT + 1, i + 1);
printf("Philosopher %d eats \n", i + 1);
sem_post(&phil[i]);
}
}
输出:
我 = 0
我 = 0
pids[i] = 282
pids[i] = 0
我 = 1
我 = 1
pids[i] = 283
pids[i] = 0
我 = 2
我 = 2
pids[i] = 284
pids[i] = 0
我 = 3
我 = 3
pids[i] = 285
pids[i] = 0
我 = 4
我 = 4
pids[i] = 286
pids[i] = 0