Столовая Философы, реализующие трубы в C - PullRequest
0 голосов
/ 14 мая 2018

Необходимо разработать программу «Обедающие философы» при использовании труб для занятий. Возникли проблемы с передачей сообщений. Вот мой код:

#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]);
  }
}

Выход:

i = 0

i = 0

pids [i] = 282

pids [i] = 0

i = 1

i = 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...