/* Программа 1
для иллюстрации работы с очередями сообщений */
/* Эта программа получает доступ к очереди
сообщений,
#include <sys/types.h>
отправляет в нее 5 текстовых сообщений с типом 1
и одно пустое сообщение
с типом 255, которое будет служить
для программы
2 сигналом прекращения работы. */
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdio.h>
#define LAST_MESSAGE 255 /* Тип сообщения для прекращения работы
программы 2 */
int main()
{
char pathname[] = "09-1a.c"; /* Имя файла, использующееся для генерации ключа.
Файл с таким именем должен существовать в текущей директории */
key_t key; /* IPC ключ */
int i,len; /* Cчетчик цикла и длина информативной части сообщения */
/* Ниже следует пользовательская структура для сообщения */
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);
/* Посылаем в цикле 5 сообщений с типом 1 в очередь сообщений, идентифицируемую
msqid.*/
for (i = 1; i <= 5; i++){
mybuf.mtype = 1;
strcpy(mybuf.mtext, "This is text message");
len = strlen(mybuf.mtext)+1;
/* Отсылаем сообщение. В случае ошибки сообщаем об этом и удаляем очередь
сообщений из системы. */
if (msgsnd(msqid, (struct msgbuf *) &mybuf,
len, 0) < 0){
msgctl(msqid, IPC_RMID, (struct msqid_ds
*) NULL);
exit(-1);
/* Отсылаем сообщение, которое заставит получающий процесс прекратить работу,
с типом LAST_MESSAGE и длиной 0 */
mybuf.mtype = LAST_MESSAGE;
len = 0;
if (msgsnd(msqid, (struct msgbuf *) &mybuf,
len, 0) < 0){
msgctl(msqid, IPC_RMID, (struct msqid_ds
*) NULL);
exit(-1);
return 0;