Скачиваний:
90
Добавлен:
12.05.2015
Размер:
913.92 Кб
Скачать

17.9. Упражнения по главе 17

17.1. В разделе 16.5 было отмечено, что функции getXXXSystem V IPC не используют маску создания файла Unix. Напишите тестовую программу, создающую канал FIFO (с помощью функцииmkfifo, описанной в разделе 13.5) и очередь сообщений System V, указав для обоих разрешение 0666 (в восьмеричном формате). Сравните разрешения для созданных объектов (FIFO и очереди сообщений). Перед запуском программы удостоверьтесь, что значениеumaskотлично от нуля.

17.2. Серверу нужно создать очередь сообщений для своих клиентов, которая имеет уникальный идентификатор. Что предпочтительнее: использовать какое-либо постоянное имя файла (например, имя программы-сервера) в качестве аргумента функции ftokили использовать ключIPC_PRIVATE?

Глава 18. Очереди сообщений System V

18.1. Введение

Каждой очереди сообщений System V сопоставляется свой уникальный идентификатор очереди сообщений. Любой процесс с соответствующими привилегиями (раздел 16.5) может поместить сообщение в очередь, и любой процесс с другими соответствующими привилегиями может считать сообщение из очереди. Для помещения сообщения в очередь не требуется наличия подключенного к ней на считывание процесса.

Ядро хранит информацию о каждой очереди сообщений в виде структуры, определенной в заголовочном файле <sys/msg.h>, основные поля которой суть следующие:

struct msqid_ds

{

struct ipc_perm msg_perm; /* разрешения чтения-записи: раздел 16.3 */

unsigned long int msg_cbytes; /* текущий размер очереди в байтах */

msgqnum_t msg_qnum; /* текущее количество сообщений в очереди */

msglen_t msg_qbytes; /* максимально допустимый размер очереди в байтах */

pid_t msg_lspid; /* идентификатор последнего процесса, вызвавшего msgsnd() */

pid_t msg_lrpid; /* идентификатор последнего процесса, вызвавшего msgrcv() */

time_t msg_stime; /* время прихода последнего сообщения (msgsnd) */

time_t msg_rtime; /* время последнего считывания сообщения (msgrcv) */

time_t msg_ctime; /* время последнего вызова msgctl(), изменившего значение

хотя бы одного из полей структуры */

};

Мы можем изобразить конкретную очередь сообщений, хранимую ядром как связный список, как показано на рис. 17.1. В этой очереди три сообщения длиной 1, 2 и 3 байта с типами 100, 200 и 300 соответственно.

В этой главе мы рассмотрим функции, используемые для работы с очередями сообщений System V, и реализуем наш пример файлового сервера из раздела 13.2 с использованием очередей сообщений.

рис. 17.1

18.2. Функция msgget

Создать новую очередь сообщений или получить доступ к существующей можно с помощью функции msgget:

#include <sys/msg.h>

int msgget (key_t key, int oflag);

/* возвращает неотрицательный идентификатор в случае успешного завершения, -1 – в случае ошибки */

Возвращаемое значение представляет собой целочисленный идентификатор, используемый тремя другими функциями msgXXXдля обращения к данной очереди. Идентификатор вычисляется на основе указанного ключа, который может быть получен с помощью функцииftokили может представлять собой константуIPC_PRIVATE, как показано на рис. 16.1.

Флаг oflagпредставляет собой комбинацию разрешений чтения-записи, показанную в табл. 16.3. К разрешениям можно добавить флагиIPC_CREATилиIPC_CREAT | IPC_CREATс помощью логического сложения, как уже говорилось в связи с рис. 16.2.

При создании новой очереди сообщений инициализируются следующие поля структуры msqid_ds:

  • полям uidиcuidструктурыmsg_permприсваивается значение действующего идентификатора пользователя вызвавшего процесса, а полямgidиcgid– действующего идентификатора группы;

  • разрешения чтения-записи, указанные в oflag, помещаются вmsg_perm.mode;

  • значения msg_qnum,msg_lspid,msg_lrpid,msg_stimeиmsg_rtimeустанавливаются в 0;

  • в msg_ctimeзаписывается текущее время;

  • в msg_qbytesпомещается системное ограничение на размер очереди.

Соседние файлы в папке Chapter.4