Основы операционных систем. Практикум



         

Example.9.1b


/* Программа 09-1b.c для иллюстрации работы с

очередями сообщений */

/* Эта программа получает доступ к очереди сообщений и читает из

нее сообщения с любым типом в порядке FIFO до тех пор, пока не

получит сообщение с типом 255, которое будет служить сигналом

прекращения работы. */

#include

#include

#include

#include

#include

#define LAST_MESSAGE 255 /* Тип сообщения для

прекращения работы */

int main()

{

int msqid; /* IPC дескриптор для очереди сообщений */

char pathname[] = "09-1a.c"; /* Имя файла,

использующееся для генерации ключа. Файл с таким

именем должен существовать в текущей директории */

key_t key; /* IPC ключ */

int len, maxlen; /* Реальная длина и максимальная

длина информативной части сообщения */

/* Ниже следует пользовательская структура для сообщения */

struct mymsgbuf

{

long mtype;

char mtext[81];

} mybuf;

/* Генерируем IPC ключ из имени файла 09-1a.c в текущей

директории и номера экземпляра очереди сообщений 0 */

if((key = ftok(pathname,0)) < 0){

printf("Can\'t generate key\n");

exit(-1);

}

/* Пытаемся получить доступ по ключу к очереди сообщений,

если она существует, или создать ее, с правами доступа

read & write для всех пользователей */

if((msqid = msgget(key, 0666 | IPC_CREAT)) < 0){

printf("Can\'t get msqid\n");

exit(-1);

}

while(1){

/* В бесконечном цикле принимаем сообщения

любого типа в порядке FIFO с максимальной длиной информативной

части 81 символ до тех пор, пока не поступит сообщение с

типом LAST_MESSAGE*/

maxlen = 81;

if(( len = msgrcv(msqid,

(struct msgbuf *) &mybuf, maxlen, 0, 0) < 0){

printf("Can\'t receive message from queue\n");

exit(-1);

}

/* Если принятое сообщение имеет тип LAST_MESSAGE,

прекращаем работу и удаляем очередь сообщений из

системы. В противном случае печатаем текст принятого

сообщения. */

if (mybuf.mtype == LAST_MESSAGE){

msgctl(msqid, IPC_RMID,

(struct msqid_ds *) NULL);

exit(0);

}

printf("message type = %ld, info = %s\n",

mybuf.mtype, mybuf.mtext);

}

return 0; /* Исключительно для отсутствия

warning'ов при компиляции. */

}




Содержание  Назад  Вперед