Добавил:
Fragga
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
static int ctrl_c(int);
int msg;
char a[9]={'0','1','2','3','4','5','6','7','8','9'};
int main(void)
{
//msg struct
typedef struct msgbf
{
long mtype;
char buf;
} message;
message mes;
int key;
int free=10;//free chairs
int slp=1;//barber is sleeping
int m=0;
signal(SIGINT,(void *)&ctrl_c);
mes.mtype=123;
key=ftok("tst",'c');
if ((msg=msgget(key,0666|IPC_CREAT))<0)
{printf("I can't create message\'s queue\n");}
printf("To exit press CTRL + C\n");
while (1)
{
m=msgrcv(msg,&mes,sizeof(message),mes.mtype,0);
if (m>0)
{
//became client
printf("Became %c client\'s\nFree chair's %d \n",mes.buf,free);
slp=0;
//decoding char=>int
mes.buf=a[mes.buf];
//
//did we have free chairs?
if (free>0)
{
if (mes.buf<=free)
{free=free-mes.buf;}
else
{
printf("%d client\'s gone out\nNot enought free chairs\n",mes.buf-free);
free=0;
}
}
else
{
printf("Not enought free chair\'s\n");
}
//working
sleep(1);
free++;
printf("%d free chairs\n",free);
}
if (free==10) slp=1;
}
//we never became here
return 0;
}
static int ctrl_c(int sig)
{
signal(SIGINT,(void *)&ctrl_c);
msgctl(msg,IPC_RMID,0);
printf("Barber going home\n");
exit(0);
}