Добавил:
Fragga
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#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");
}