Статья: Механизмы межпроцессных взаимодействий в операционной системе Unix
процесс должен иметь право на запись в очередь
длина сообщения не должна превосходить верхний предел
общая длина сообщений не должна превосходить установленного предела
тип сообщения должен быть положительным целым числом
Процесс продолжает свое выполнение
Ядро активизирует (пробуждает) все процессы, ожидающие поступления сообщений из очереди
Превышается верхний предел суммарной длины сообщений
обратившийся процесс откладывается до разгрузки очереди
но есть флаг IPC_NOWAIT (как для семафоров)
count = msgrcv(id, msg, maxcount, type, flag);
msg - указатель на структуру данных в адресном пространстве пользователя для размещения принятого сообщения
maxcount - размер области данных (массива байтов) в структуре msg
type специфицирует тип сообщения, которое желательно принять
flag указывает ядру, что следует предпринять, если в указанной очереди сообщений отсутствует сообщение с указанным типом
count - реальное число байтов, переданных пользователю
Значением параметра type является нуль
выбирается первое сообщение
копируется в заданную пользовательскую структуру данных
процессы, отложенные по причине переполнения очереди сообщений, активизируются
если значение параметра maxcount оказывается меньше реального размера сообщения, ядро не удаляет сообщение из очереди и возвращает код ошибки
если задан флаг MSG_NOERROR, то выборка сообщения производится, и в буфер пользователя переписываются первые maxcount байтов сообщения
Значение type есть положительное целое число
выбирается первое сообщение с таким же типом
Значение type есть отрицательное целое число
выбирается первое сообщение, значение типа которого меньше или равно абсолютному значению type
В очереди отсутствуют сообщения, соответствующие спецификации type
процесс откладывается до появления в очереди требуемого сообщения
но есть флаг IPC_NOWAIT
msgctl(id, cmd, mstatbuf);