Добавил:
Fragga
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабораторки по ОС препод Челноков / 2семестр / wi2 / chernok / lab4 / main
.c/***************************************************************************
main.c - description
-------------------
begin : юФЧ нБК 6 21:24:49 MSD 2004
copyright : (C) 2004 by бМЕЛУЕК
email : achernok@mail.ru
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#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 Aristotel,Kant,Platon,Nitshe,Pifagor;
static key_t key,semid;
int main(int argc, char *argv[])
{
signal(SIGINT,&onsigint);
if ((key=ftok("server",'A'))<0)
{
printf("FTOK ERROR!!!\n");
}
semid=semget(key,5,0777 | IPC_CREAT);
switch(Aristotel=fork())
{
case -1:;
case 0:
{
strcpy(name,"Aristotel ");
Aristotel=getpid();
printf("%s process identifire is: %d\n",name,Aristotel);
fillstruct(0);
state(0);
}
default:
switch (Kant=fork())
{
case -1:printf("Fork error while creating new process\n");
case 0:
{
strcpy(name,"Kant ");
Kant=getpid();
printf("%s process identifire is: %d\n",name,Kant);
fillstruct(1);
state(0);
}
default:
{
switch(Platon=fork())
{
case -1:printf("Fork error while creating new process\n");
case 0:
{
strcpy(name,"Platon ");
Platon=getpid();
printf("%s process identifire is: %d\n",name,Platon);
fillstruct(2);
state(0);
}
default:
{
switch(Pifagor=fork())
{
case -1:printf("Fork error while creating new process\n");
case 0:
{
strcpy(name,"Pifagor ");
Pifagor=getpid();
printf("%s process identifire is: %d\n",name,Pifagor);
fillstruct(3);
state(0);
}
default:
{
switch(Nitshe=fork())
{
case -1:printf("Fork error while creating new process\n");
case 0:
{
strcpy(name,"Nitshe ");
Nitshe=getpid();
printf("%s process identifire is: %d\n",name,Nitshe);
fillstruct(4);
state(0);
}
default:
strcpy(name,"Servant ");
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: Start Eating Macarony\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: Start Talking About Politics\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: Recieved signal SIGINT to abort process(%d)\n",name,getpid());
semctl(semid,pnum,IPC_RMID);
exit(0);
}
void onsigalarm(int sig)
{
printf("%s You have eaten all macarony!!!\n",name);
kill(Nitshe,9);
printf("Nitshe Left canteen.\n");
kill(Pifagor,9);
printf("Pifagor Left canteen.\n");
kill(Platon,9);
printf("Platon Left canteen.\n");
kill(Kant,9);
printf("Kant Left canteen.\n");
kill(Aristotel,9);
printf("Aristotel Left canteen.\n");
}