/* Программа 2
для иллюстрации работы с очередями сообщений */
/* Эта программа получает доступ к очереди
сообщений,
#include <sys/types.h>
и читает из нее сообщения с любым типом в порядке FIFO до тех пор,
пока не получит сообщение
с типом 255, которое будет служить
сигналом прекращения работы.
*/
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdio.h>
#define LAST_MESSAGE 255 /* Тип сообщения для прекращения работы
*/
int main()
{
char pathname[] = "09-1a.c"; /* Имя файла, использующееся для генерации ключа.
Файл с таким именем должен существовать в текущей директории */
key_t key; /* IPC ключ */
int len, maxlen; /* Реальная длина и максимальная длина информативной части
сообщения */
/* Ниже следует пользовательская структура для сообщения */
struct mymsgbuf
{
char mtext[81];
/* Генерируем IPC ключ из имени файла 09-1a.c в текущей директории
и номера экземпляра очереди сообщений 0 */
if((key = ftok(pathname,0)) < 0){
exit(-1);
/* Пытаемся получить доступ по ключу к очереди сообщений, если она существует,
или создать ее, если она еще не существует, с правами доступа
read & write для всех пользователей */
if((msqid = msgget(key, 0666 | IPC_CREAT))
< 0){
exit(-1);
while(1){
maxlen = 81;
if(( len = msgrcv(msqid, (struct msgbuf
*) &mybuf, maxlen, 0, 0) < 0){
exit(-1);
/* Если принятое сообщение имеет тип LAST_MESSAGE, прекращаем работу и удаляем
очередь сообщений из системы.
В противном случае печатаем текст принятого сообщения. */
if (mybuf.mtype == LAST_MESSAGE){
exit(0);
printf("message type = %ld, info = %s\n", mybuf.mtype, mybuf.mtext);
return 0; /* Исключительно для отсутствия warning'ов при компиляции. */