Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по ОС.doc
Скачиваний:
50
Добавлен:
24.09.2019
Размер:
202.24 Кб
Скачать

11)Очередь сообщений. Последовательность системных вызовов.

Очередь сообщений - это область памяти, доступная для чтения\записи нескольким процесса. В адресном пространстве ядра имеется таблица очередей сообщений, в которой отслеживаются все очереди сообщений, создаваемые в системе. Для работы с очередью сообщений определены функции: msgget, msgsnd, msgrcv, msgctl.

12) Параметры функции msgget.

функция msgget- для работы с очередью сообщений

Прототип Функции msgget выглядит следующим образом:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/message.h>

int msgget (key_t key, int flag);

Эта функция открывает очередь сообщений, идентификатор которой совпадает со значением аргумента key, и возвращает положительный целочисленный дескриптор. Его можно использовать в других функциях сообщений для передачи и приема сообщений, а также для запроса и/или установки управляющих параметров очереди.

Если значение аргумента key — положительное целое, эта функция пробует открыть очередь сообщений, идентификатор которой совпадает с данным значением. Если же значением key является макрос IPC_PRIVATE, вызов создает новую очередь сообщений, которая будет использоваться исключительно вызывающим процессом.

Если аргумент flag имеет нулевое значение очереди сообщений, идентификатор которой совпадал бы с заданным значением key, то вызов прерывается; в противном случае возвращается дескриптор этой очереди. Если процессу необходимо создать новую очередь (когда нет ни одной очереди), то значение аргумента flag должно содержать макрос IPC_CREAT, а также права на чтение сообщения из новой очереди и запись в неё (для. владельца, группы и прочих).

Если желательно иметь гарантию создания новой очереди сообщений, можно указать одновременно с флагом IPC_CREAT флаг IPC_EXCL, и этот вызов будет успешно выполнен только в том случае, если он создаст новую очередь с заданным значением key.

13)Параметры функции msgsnd.

Прототип функции msgsnd выглядит следующим образом: #include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int msgsnd(int msgfd, const void*msgPtr, int len, int flag)

Эта функция передает сообщение (на которое указывает msgPtr) в очередь, обозначенную дескриптором msgfd.

Значение msgfd определяется возвращаемым значащем функции msgget.

Фактическое значение аргумента msgPtr — указателе на объект, который содержит реальный текст и тип сообщения, подлежащего передаче

Значение аргумента 1еn —это размер (в байтах поля mtext объекта, на который указывает аргумент msgPtr.

Аргумент flag может иметь значение 0. Это означает, что при необходимости процесс можно блокировать до тех пор, пока данная функция не будет успешно выполнена. Бела этот аргумент имеет значение IPC_NOWAIT, то при блокировании процесса выполнение функция прерывается. В случае успешного выполнения возвращается 0, а в случае неудачи -1.

14)Параметры функции msgrcv.

Прототип функции msgrcv выглядит так:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int msgrcv (int msgfd, const void* msgPtr, int len, int mtype, int flag );

Эта функция принимает сообщение типа mtype из очереди сообщений, обозначенной дескриптором msgfd. Полученное сообщение хранится в объекте, на который указывает аргумент msgPtr. Значение аргумента len — это максимальный размер (в байтах) текста сообшения, которое может быть принято данным вызовом.

Значение msgfd берется из вызова функции msgget

Фактическое значение аргумента msgPtr - указатель на объект, имеющий структуру данных, похожую на struct msgbuf.

Значение mtype.— это тип сообщения, подлежащего приему. Ниже перечислены возможные значения данного аргумента и их смысл.

Значение mtype

Положительное целое Принять самое старое сообщение указанного типа

Отрицательное целое Принять сообщение, тип которого меньше абсолютного значения, mtype или равен ему

Если таких сообщение в очереди несколько, принять то, которое является самым старым и имеет наименьшее значение типа

Аргумент flag может иметь значение 0. Это означает, что провесе можно блокировать, если ни одно сообщение в очереди не удовлетворяет критериям выбора, заданным аргументом mtype. Если в очереди есть сообщение, которое удовлетворяет этим критериям, но превышает величину len, то функция возвращает код неудачного завершения.

Если процесс указал в аргументе flag значение IPC_NOWAIT, то вызов будет неблокирующим. Кроме того, если в названном аргументе установлен флаг MSG_NOERROR, то сообщение, находящееся в очереди, можно читать (даже если его размер превышает len байтов). Функция возвращает вызывающему процессу первые 1еи байтов текста сообщения, а остальные данные отбрасывает.

Функция msgrcv возвращает количество байтов объекта, на который указывает аргумент msgPtr, или -1 (в случае неудачи).

Значение cmd

Смысл

IPC_STAT

Копировать управляющие параметры очереди в объект, указанный аргументом mbufPtr

IPC_SET

Заменить управляющие параметры очереди параметрами, содержащимися в объекте, на который указывает аргумент mbufPtr. Чтобы выполнить эту операцию, вызывающий процесс должен иметь права либо привилегированного пользователя, либо создателя или назначенного владельца очереди. С помощью этого вызова можно устанавливать UID владельца очереди и идентификатор его группы, права доступа и (или) уменьшать лимит msg_qhyte очереди

IPC_RMID

Удалить очередь из системы. Чтобы выполнить эту операцию, вызывающий процесс должен иметь права либо привилегированного пользователя, либо создателя или назначенного владельца очереди