В качестве filename
можно использовать имя некоторого файла, известное взаимодействующим процессам. Например, это может быть имя программы-сервера. Важно, чтобы этот файл существовал на момент создания ключа. Также нежелательно использовать имя файла, который создается и удаляется в процессе работы распределенного приложения, поскольку при генерации ключа используется номер inode файла. Вновь созданный файл может иметь другой inode и впоследствии процесс, желающий иметь доступ к объекту, получит неверный ключ.
Пространство имен позволяет создавать и совместно использовать IPC неродственным процессам. Однако для ссылок на уже созданные объекты используются идентификаторы, точно так же, как файловый дескриптор используется для работы с файлом, открытым по имени.
Каждое из перечисленных IPC имеет свой уникальный дескриптор (идентификатор), используемый ОС (ядром) для работы с объектом. Уникальность дескриптора обеспечивается уникальностью дескриптора для каждого из типов объектов (очереди сообщений, семафоры и разделяемая память), т.е. какая-либо очередь сообщений может иметь тот же численный идентификатор, что и разделяемая область памяти (хотя любые две очереди сообщений должны иметь различные идентификаторы).
Таблица 3.5. Идентификация объектов IPC
Объект IPC | Пространство имен | Дескриптор |
---|---|---|
Канал | – | Файловый дескриптор |
FIFO | Имя файла | Файловый дескриптор |
Очередь сообщений | Ключ | Идентификатор |
Объект IPC | Пространство имен | Дескриптор |
Семафор | Ключ | Идентификатор |
Разделяемая память | Ключ | Идентификатор |
Работа с объектами IPC System V во многом сходна. Для создания или получения доступа к объекту используются соответствующие системные вызовы key
и флажки создания объекта ipcflag
. Остальные аргументы зависят от конкретного типа объекта. Переменная ipcflag
определяет права доступа к объекту PERM
, а также указывает, создается ли новый объект или требуется доступ к существующему. Последнее определяется комбинацией (или отсутствием) флажков IPC_CREAT
и IPC_EXCL
.
Права доступа к объекту указываются набором флажков доступа, подобно тому, как это делается для файлов:
Значение PERM (в восьмеричном виде) | Аналог прав доступа для файлов | Разрешено |
---|---|---|
0400 | r-------- | Чтение для владельца-пользователя |
0200 | -w------- | Запись для владельца-пользователя |
0040 | ---r----- | Чтение для владельца-группы |
0020 | ----w---- | Запись для владельца-группы |
0004 | ------r-- | Чтение для всех остальных |
0002 | -------w- | Запись для всех остальных |
Комбинацией флажков можно добиться различных результатов:
Значение аргумента ipcflag | Результат действия функции | |
---|---|---|
Объект существует | Объект не существует | |
0 | Возвращает дескриптор | Ошибка: отсутствие объекта (ENOENT ) |
PERM | IPC_CREAT | Возвращает дескриптор | Создает объект с соответствующими PERM правами доступа |
PERM | IPC_CREAT | Ошибка: объект уже существует (EEXIST ) | Создает объект с соответствующими PERM правами доступа |
Работа с объектами IPC System V во многом похожа на работу с файлами в UNIX. Одним из различий является то, что файловые дескрипторы имеют значимость в контексте процесса, в то время как значимость дескрипторов объектов IPC распространяется на всю систему. Так файловый дескриптор 3 одного процесса в общем случае никак не связан с дескриптором 3 другого неродственного процесса (т.е. эти дескрипторы ссылаются на различные файлы). Иначе обстоит дело с дескрипторами объектов IPC. Все процессы, использующие, скажем, одну очередь сообщений, получат одинаковые дескрипторы этого объекта.