Механизм очередей дает процессам возможность посылать другим процессам потоки сформатированных данных. Процесс имеет возможность послать сообщение в определенную очередь и принять сообщение из очереди. Передача данных в очереди происходит всегда сообщениями, причем каждое сообщение имеет заголовок и тело. Заголовок всегда имеет фиксированный для данной системы формат. В него обязательно входит длина сообщения, а другая информация зависит от спецификаций конкретной системы: это может быть приоритет сообщения, тип сообщения, идентификатор процесса, пославшего сообщение, и т.п. Тело сообщения интерпретируется по правилам, устанавливаемым самими процессами: отправителем и получателем. Заголовок и тело представляют собой существенно разные структуры данных и располагаются в разных местах в памяти. Собственно очередь ОС составляет из заголовков сообщений. В элементы очереди включаются указатели на тела сообщений, располагающиеся в памяти системы.
Системные вызовы Unix/Linux
ОС Unix/Linux механизм очередей сообщений обеспечивается четырьмя системными вызовами:
msgget,
msgctl,
msgsnd,
msgrcv.
Системный вызов msgget создает новую очередь или возвращает идентификатор уже существующей очереди. Как и другие средства взаимодействия между процессами, очереди в Unix/Linux (как и семафоры) не имеют внешних имен. При получении идентификатора очереди процесс пользуется числовым ключом. Гарантированно уникальную очередь можно создать с использованием ключа IPC_PRIVATE. При работе с очередью один из процессов создает очередь и получает ее идентификатор. Этот идентификатор затем передается используется процессом-создателем другим (возможно, дочерним) процессам и используется процессами для выполнения операций с очередью. Сформировать ключ также можно с помощью ftok.
Системный вызов msgctl позволяет выполнять управляющие операции над очередью: получать информацию о ее состоянии, изменять права доступа к ней, уничтожать очередь.
Системные вызовы msgsnd и msgrcv выполняют посылку и прием сообщения соответственно. При посылке и приеме сообщений процессы оперируют числовым типом сообщения и текстом сообщения. Тип сообщения может выполнять роль приоритета: процесс может выбирать из очереди сообщения заданного типа или сообщения, имеющие наименьшее число типа. Если выборка по типу не применяется, сообщения выбираются по принципу FIFO.
Внимание!
В процессе отладки программы у Вас могут возникать ситуации, когда программа
будет аварийно заканчиваться или прерываться Вами прежде, чем она уничтожит
созданные ею очереди. Такие очереди не удаляются в системе автоматически и
могут накапливаться в течение многих дней. Накопление таких "забытых" очередей
может привести к тому, что будет исчерпан системный лимит на количество
очередей, и очередной вызов msgget закончится с
ошибкой. Для того, чтобы этого не происходило, регулярно выполняйте процедуру
очистки IPC: /home/metod/rmipc. Выполняйте
эту процедуру также перед каждым выходом из сеанса.
Список созданных Вами очередей Вы можете увидеть, выполнив команду:
ipcs -q.
|
Пример выполнения приведен здесь.
Справочный материал
Избранные системные вызовы Linux/Unix. Краткое описание.
Cправочник библиотечных функция языка С: часть 1,
часть 2 (кодировка кириллица ibm866).