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

         

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


где id - дескриптор сообщения, msg - адрес пользовательской структуры, которая будет содержать полученное сообщение, maxcount - размер структуры msg, type - тип считываемого сообщения, flag - действие, предпринимаемое ядром в том случае, если в очереди сообщений нет. В переменной count пользователю возвращается число прочитанных байт сообщения.

Ядро проверяет (), имеет ли пользователь необходимые права доступа к очереди сообщений. Если тип считываемого сообщения имеет нулевое значение, ядро ищет первое по счету сообщение в связном списке. Если его размер меньше или равен размеру, указанному пользователем, ядро копирует текст сообщения в пользовательскую структуру и соответствующим образом настраивает свои внутренние структуры: уменьшает счетчик сообщений в очереди и суммарный объем информации в байтах, запоминает время получения сообщения и идентификатор процесса-получателя, перестраивает связный список и освобождает место в системном пространстве, где хранился текст сообщения. Если какие-либо процессы, ожидавшие получения сообщения, находились в состоянии приостанова из-за отсутствия свободного места в списке, ядро выводит их из этого состояния. Если размер сообщения превышает значение maxcount, указанное пользователем, ядро посылает системной функции уведомление об ошибке и оставляет сообщение в очереди. Если, тем не менее, процесс игнорирует ограничения на размер (в поле flag установлен бит MSG_NOERROR), ядро обрезает сообщение, возвращает запрошенное количество байт и удаляет сообщение из списка целиком.

#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>

#define MSGKEY 75

struct msgform { long mtype; char mtext[256]; };

main() { struct msgform msg; int msgid,pid,*pint;

msgid = msgget(MSGKEY,0777);

pid = getpid(); pint = (int *) msg.mtext; *pint = pid; /* копирование идентификатора * процесса в область текста * сообщения */ msg.mtype = 1;

msgsnd(msgid,&msg,sizeof(int),0); msgrcv(msgid,&msg,256,pid,0); /* идентификатор * процесса используется в * качестве типа сообщения */ printf("клиент: получил от процесса с pid %d\n", *pint); }




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