Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
На практике все гораздо проще. Если вы просто хотите получать сообщения в порядке их отправления, задайте
msgtypemsgtypenmsgtype-nЧетвертый параметр
msgflgmsgflgIPC_NOWAITIPC_NOWAITmsgflgВ случае успешного завершения функция msgrcv вернет количество байтов, помещенных в буфер приема, сообщение копируется в выделяемый пользователем буфер, на который указывает
msg_ptrmsgctl
Последняя функция обработки очереди сообщений
msgctlint msgctl(int msqid; int command, struct msqid_ds *buf);Структура
msqid_ds<b>struct msqid_ds {</b><b> uid_t msg_perm.uid;</b><b> uid_t msg_perm.gid;</b><b> mode_t msg_perm.mode;</b><b>}</b>Первый параметр
msqidmsggetВторой параметр
commandТаблица 14.3
| Значение | Описание |
|---|---|
IPC_STAT | Задает данные в структуре msqid_ds |
IPC_SET | Если у процесса есть на это право, это действие устанавливает значения, связанные с очередью сообщений, в соответствии с данными структуры msqid_ds |
IPC_RMID | Удаляет очередь сообщений |
В случае успешного завершения возвращает 0, в случае аварийного — -1. Если очередь сообщений удаляется, когда процесс ожидает в функции
msgsndmsgrcvВыполните упражнение 14.3.
Теперь, когда вы познакомились с объявлениями, относящимися к очередям сообщений, можно посмотреть, как они действуют на практике. Как и раньше, вы напишите две программы: msg1.c для получения и msg2.c для отправки сообщений. Вы разрешите обеим программам создавать очередь сообщений, но используете для удаления очереди программу-приемник после того, как она получит последнее сообщение.
1. Далее приведена программа-приемник msg1 .с:
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <sys/msg.h>struct my_msg_st { long int my_msg_type; char some_text[BUFSIZ];};int main() { int running = 1; int msgid; struct my_msg_st some_data; long int msg_to_receive = 0;2. Прежде всего, задайте очередь сообщений:
msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if (msgid == -1) { fprintf(stderr, "msgget failed with error: %dn", errno); exit(EXIT_FAILURE); }3. Далее сообщения извлекаются из очереди до тех пор, пока не будет обнаружено сообщение
end while (running) { if (msgrcv(msgid, (void *)&some_data, BUFSIZ, msg_to_receive, 0) == -1) { fprintf(stderr, "msgrcv failed with error: %dn", errno); exit(EXIT_FAILURE); } printf("You wrote: %s", some_data.some_text); if (strncmp(some_data.some_text, "end", 3) == 0) { running = 0; } } if (msgctl(msgid, IPC_RMID, 0) == -1) { fprintf(stderr, "msgctl(IPC_RMID) failedn"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS);}4. Программа-отправитель msg2.c очень похожа на программу msg1.с. В функции main удалите объявление
msg_to_receivebuffer[BUFSIZ]running#include <stdlib.h>#include <stdio.h>