Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
4
Добавлен:
26.05.2014
Размер:
1.26 Кб
Скачать
#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);
}
Соседние файлы в папке 4
  • #
    26.05.20141.26 Кб4barb.c
  • #
    26.05.201412.03 Кб4barber
  • #
    26.05.2014638 б4cl.c
  • #
    26.05.201411.3 Кб4client
  • #
    26.05.2014212 б4Makefile