Архитектура операционной системы UNIX


         

Сообщения - часть 4


Рисунок 11.6. Пользовательский процесс

алгоритм msgrcv /* получение сообщения */ входная информация: (1) дескриптор сообщения (2) адрес массива, в который заносится сообщение (3) размер массива (4) тип сообщения в запросе (5) флаги выходная информация: количество байт в полученном сообщении { проверить права доступа; loop: проверить правильность дескриптора сообщения; /* найти сообщение, нужное пользователю */ если (тип сообщения в запросе == 0) рассмотреть первое сообщение в очереди; в противном случае если (тип сообщения в запросе > 0) рассмотреть первое сообщение в очереди, имеющее данный тип; в противном случае /* тип сообщения в запросе < 0 */ рассмотреть первое из сообщений в очереди с наи- меньшим значением типа при условии, что его тип не превышает абсолютное значение типа, указанно- го в запросе; если (сообщение найдено) { переустановить размер сообщения или вернуть ошиб- ку, если размер, указанный пользователем слишком мал; скопировать тип сообщения и его текст из прост- ранства ядра в пространство задачи; разорвать связь сообщения с очередью; вернуть управление; } /* сообщений нет */ если (флаги не разрешают приостанавливать работу) вернуть управление с ошибкой; приостановиться (пока сообщение не появится в очере- ди); перейти на loop; }

Рисунок 11.7. Алгоритм получения сообщения

Процесс может получать сообщения определенного типа, если присвоит параметру type соответствующее значение. Если это положительное целое число, функция возвращает первое значение данного типа, если отрицательное, ядро определяет минимальное значение типа сообщений в очереди, и если оно не превышает абсолютное значение параметра type, возвращает процессу первое сообщение этого типа. Например, если очередь состоит из трех сообщений, имеющих тип 3, 1 и 2, соответственно, а пользователь запрашивает сообщение с типом -2, ядро возвращает ему сообщение типа 1. Во всех случаях, если условиям запроса не удовлетворяет ни одно из сообщений в очереди, ядро переводит процесс в состояние приостанова, разумеется если только в параметре flag не установлен бит IPC_NOWAIT (иначе процесс немедленно выходит из функции).




Содержание  Назад  Вперед