Архитектура Unix

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



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

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


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

Рассмотрим программы, представленные на Рисунках 11.6 и 11.8. Программа на Рисунке 11.8 осуществляет общее обслуживание запросов пользовательских процессов (клиентов). Запросы, например, могут касаться информации, хранящейся в базе данных; обслуживающий процесс (сервер) выступает необходимым посредником при обращении к базе данных, такой порядок облегчает поддержание целостности данных и организацию их защиты от несанкционированного доступа. Обслуживающий процесс создает сообщение путем установки флага IPC _CREAT при выполнении функции msgget и получает все сообщения типа 1 - запросы от процессов-клиентов. Он читает текст сообщения, находит идентификатор процесса-клиента и приравнивает возвращаемое значение типа сообщения значению этого идентификатора. В данном примере обслуживающий процесс возвращает в тексте сообщения процессу-клиенту его идентификатор, и клиент получает сообщения с типом, равным идентификатору клиента. Таким образом, обслуживающий процесс получает сообщения только от клиентов, а клиент - только от обслуживающего процесса. Работа процессов реализуется в виде многоканального взаимодействия, строящегося на основе одной очереди сообщений.



Содержание раздела