Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
26.05.2014
Размер:
5.13 Кб
Скачать
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <signal.h>
#define PERM 0666;
#define Talk 0;
#define TakeLeft 1;
#define TakeRight 2;
#define Eat 3;
#define ReleaseRight 4;
#define ReleaseLeft  5;
static struct sembuf take_left_fork[2]={0,0,0,
                                        0,1,0};
static struct sembuf release_left_fork[1]={0,-1,0};
//static struct sembuf proc_wait[1]={0,-1,0};
//static struct sembuf proc_waits[1]={0,-1,0};
static struct sembuf take_right_fork[2]={0,0,0,
                                        0,1,0};
static struct sembuf release_right_fork[1]={0,-1,0};
static void onsigint(int sig);
static void onsigalarm(int sig);
static void state(int st);
static void fillstruct(int num);
int pnum;
char name[12];
pid_t Gast1,Gast2,Gast3,Gast4,Gast5;
static key_t key,semid;
int main(int argc, char *argv[])
{
  signal(SIGINT,&onsigint);
  if ((key=ftok("server",'A'))<0)
  {
    printf("Nevozmojno polu4itj klu4!\n");
  }
  semid=semget(key,5,0777 | IPC_CREAT); //O4eredj
  switch(Gast1=fork())
  {
    case -1: printf ("Oshibka v sozdanii processa \n");
    case  0:
      {
        strcpy(name,"Gast1 ");
        Gast1=getpid();
        printf("%s Identificator processa: %d\n",name,Gast1);
        fillstruct(0);
        state(0);
      }    
    default:
      switch (Gast2=fork())
      {
        case -1:printf("Oshibka v sozdanii new processa\n");
        case  0:
          {
            strcpy(name,"Gast2 ");
            Gast2=getpid();
            printf("%s Identificator processa: %d\n",name,Gast2);
            fillstruct(1);
            state(0);
          }    
        default:
          {
            switch(Gast3=fork())
            {
              case -1:printf("Oshibka v sozdanii new processa\n");
              case  0:
                {
                  strcpy(name,"Gast3 ");
                  Gast3=getpid();
                  printf("%s Identificator processa: %d\n",name,Gast3);
                  fillstruct(2);
                  state(0);
                }    
              default:
                {
                  switch(Gast5=fork())
                  {
                    case -1:printf("Oshibka v sozdanii new processa\n");
                    case  0:
                      {
                        strcpy(name,"Gast5 ");
                        Gast5=getpid();
                        printf("%s Identificator processa: %d\n",name,Gast5);
                        fillstruct(3);
                        state(0);
                      }    
                    default:
                      {
                        switch(Gast4=fork())
                        {
                          case -1:printf("Oshibka v sozdanii new processa\n");
                          case  0:
                            {
                              strcpy(name,"Gast4 ");
                              Gast4=getpid();
                              printf("%s Identificator processa: %d\n",name,Gast4);
                              fillstruct(4);
                              state(0);
                            }    
                          default:
                            strcpy(name,"  ");
                            signal(SIGALRM,&onsigalarm);
                            alarm(90);
                            while(1)
                               pause()  ;
                        }
                      }
                  }
                }
              
            }
          }
        
      }
  }
  return EXIT_SUCCESS;
}

void state(int st)
{
  switch(st)
  {
     //Talk
     case 0:
      { sleep(2);
        semop(semid,&take_left_fork[0],2);
        state(1);
      };
     //TaleLeft 
     case 1:
      {
        semop(semid,&take_right_fork[0],2);
        state(2);
      };
      //TakeRight
     case 2:
      {
        sleep(2);
        state(3);
      };
      //Eat
     case 3:
      {
        
        printf("%s: Na4al estj makaroni\n",name);
        sleep(5);
        semop(semid,&release_right_fork[0],1);
        state(4);
      };
      //ReleaseRight
     case 4:
      {
        semop(semid,&release_left_fork[0],1);
        state(5);
      };
      //ReleaseLeft
     case 5:
      {
        printf("%s: Na4al govoritj o politlke\n",name);
        state(0);
      };
     
   
  }
}
void fillstruct(int num)
{
  pnum=num;
  take_left_fork[0].sem_num=num;
  take_left_fork[1].sem_num=num;
  take_right_fork[0].sem_num=(num+1)%5;
  take_right_fork[1].sem_num=(num+1)%5;
  release_left_fork[0].sem_num=num;
  release_right_fork[0].sem_num=(num+1)%5;
} 

void onsigint(int sig)
{
  printf("%s Postupil SIGINT (%d)\n",name,getpid());
  semctl(semid,pnum,IPC_RMID);
  exit(0);
}
void onsigalarm(int sig)
{
  printf("%s Macaroni vse sjedeni!\n",name);
  kill(Gast4,9);
  printf("Gast4 Left canteen.\n");
  kill(Gast5,9);
  printf("Gast5 Left canteen.\n");
  kill(Gast3,9);
  printf("Gast3 Left canteen.\n");
  kill(Gast2,9);
  printf("Gast2 Left canteen.\n");
  kill(Gast1,9);
  printf("Gast1 Left canteen.\n");
}
Соседние файлы в папке lab4
  • #
    26.05.201414.61 Кб5a.out
  • #
    26.05.20145.13 Кб5main.c
  • #
    26.05.20140 б5server