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

17.3. Структура ipc_perm

Для каждого объекта IPC, как для обычного файла, в ядре хранится набор информации, объединенной в структуру, основные поля которой суть следующие:

struct ipc_perm

{

key_t key; /* ключ IPC */

uid_t uid; /* идентификатор пользователя-владельца */

gid_t gid; /* идентификатор группы-владельца */

uid_t cuid; /* идентификатор пользователя-создателя */

gid_t cgid; /* идентификатор группы создателя */

unsigned short int mode; /* разрешения чтения-записи */

unsigned short int seq; /* последовательный номер */

};

Эта структура вместе с другими именованными константами для функций System V IPC определена в файле <sys/ipc.h>. В этой главе мы расскажем о полях структуры ipc_permболее подробно.

17.4. Создание и открытие каналов ipc

Три функции getXXX, используемые для создания или открытия объектов IPC (табл. 16.1), принимают ключ IPC (типа key_t) в качестве одного из аргументов и возвращают целочисленный идентификатор. Этот идентификатор отличается от того, который передавался функции ftok, как мы вскоре увидим. У приложения есть две возможности задания ключа (первого аргумента функций getXXX):

  1. Вызвать ftok, передать ей полное имя и идентификатор.

  2. Указать в качестве ключа константу IPC_PRIVATE, гарантирующую создание нового уникального объекта IPC.

Последовательность действий иллюстрирует рис. 16.1.

рис. 16.1

Все три функции getXXX (табл. 16.1) принимают в качестве второго аргумента набор флагов oflag, задающий биты разрешений чтения-записи (поле mode структуры ipc_perm) для объекта IPC и определяющий, создается ли новый объект IPC или производится обращение к уже существующему. Для этого имеются следующие правила:

  • ключ IPC_PRIVATEгарантирует создание уникального объекта IPC. Никакие комбинации полного имени и идентификатора не могут привести к тому, что функцияftokвернет в качестве ключа значениеIPC_PRIVATE;

  • установка бита IPC_CREATаргументаoflagприводит к созданию новой записи для указанного ключа, если она еще не существует. Если же обнаруживается существующая запись, возвращается ее идентификатор;

  • одновременная установка битов IPC_CREATиIPC_EXCLаргументаoflagприводит к созданию новой записи для указанного ключа только в том случае, если такая запись еще не существует. Если же обнаруживается существующая запись, функция возвращает ошибкуEEXIST(объект IPC уже существует).

Комбинация IPC_CREATиIPC_EXCLв отношении объектов IPC действует аналогично комбинацииO_CREATиO_EXCLдля функцииopen. Установка только битаIPC_EXCLбезIPC_CREATникакого эффекта не дает.

Логическая диаграмма последовательности действий при открытии объекта IPC изображена на рис. 16.2. В табл.16.2показан альтернативный взгляд на этот процесс.

рис. 16.2

Таблица 16.2

Логика создания и открытия объектов IPC

Аргумент oflag

Ключ не существует

Ключ существует

Специальные флаги не установлены

Ошибка, errno=ENOENT

OK, открытие существующего объекта

IPC_CREAT

OK, создается новая запись

OK, открытие существующего объекта

IPC_CREAT|IPC_EXCL

OK, создается новая запись

Ошибка, errno=EEXIST

Обратите внимание, что в средней строке табл. 16.2для флагаIPC_CREATбезIPC_EXCLмы не получаем никакой информации о том, был ли создан новый объект или получен доступ к существующему. Для большинства приложений характерно создание сервером объекта IPC с указаниемIPC_CREAT(если безразлично, существует ли уже объект) илиIPC_CREAT|IPC_EXCL(если требуется проверка существования объекта). Клиент вообще не указывает флагов, предполагая, что сервер уже создал объект.

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