Читать «UNIX: взаимодействие процессов» онлайн - страница 28
Уильям Ричард Стивенс
ПРИМЕЧАНИЕ
Функции System V IPC в отличие от функций Posix IPC определяют свои собственные константы IРС_ххх вместо использования O_CREAT и OEXCL, принимаемых стандартной функцией open (табл. 2.2).
Обратите также внимание на то, что функции System V IPC совмещают константы IРС_ххх с битами разрешений (описанными в следующем разделе) в едином аргументе oflag, тогда как для функции open и для Posix IPC характерно наличие двух аргументов: oflag, в котором задаются флаги вида О_ххх, и mode, определяющего биты разрешений доступа.
Таблица 3.2. Логика создания и открытия объектов IPC
Аргумент oflag | Ключ не существует | Ключ существует |
---|---|---|
Специальные флаги не установлены | Ошибка, errno=ENOENT | OK, открытие существующего объекта |
IPC_CREAT | OK, создается новая запись | OK, открытие существующего |
IPC CREAT|IPC_EXCL | OK, создается новая запись | Ошибка, errno=EEXIST |
3.5. Разрешения IPC
При создании нового объекта IPC с помощью одной из функций getXXX, вызванной с флагом IPC_CREAT, в структуру ipc_perm заносится следующая информация (раздел 3.3):
1. Часть битов аргумента
2. Поля cuid и cgid получают значения, равные действующим идентификаторам пользователя и группы вызывающего процесса. Эти два поля называются идентификаторами создателя.
3. Поля uid и gid структуры iрс_perm также устанавливаются равными действующим идентификаторам вызывающего процесса. Эти два поля называются идентификаторами владельца.
Таблица 3.3. Значения mode для разрешений чтения-записи IPC
Число (восьмеричное) | Очередь сообщений | Семафор | Разделяемая память | Описание |
---|---|---|---|---|
0400 | MSG_R | SEM_R | SHM_R | Пользователь — чтение |
0200 | MSG_W | SEM_A | SHM_W | Пользователь — запись |
0040 | MSG R>>3 | SEM_R>>3 | SHM_R>>3 | Группа — чтение |
0020 | MSG_W>>3 | SEM_A>>3 | SHM_W>>3 | Группа — запись |
0004 | MSG_R>>6 | SEM_R>>6 | SHM_R>>6 | Прочие — чтение |
0002 | MSG_W>>6 | SEM_A>>6 | SHM_W>>6 | Прочие — запись |
Идентификатор создателя изменяться не может, тогда как идентификатор владельца может быть изменен процессом с помощью вызова функции ctlXXX для данного механизма IPC с командой IPC_SET. Три функции ctlXXX позволяют процессу изменять биты разрешений доступа (поле mode) объекта IPC.