UNIX: взаимодействие процессов | страница 25
Рис. 2.1. Логика открытия объекта IPC
Обратите внимание, что в средней строке табл. 2.4, где задан только флаг O_CREAT, мы не получаем никакой информации о том, был ли создан новый объект или открыт существующий.
Таблица 2.4. Логика открытия объекта IPC
Аргумент oflag | Объект не существует | Объект уже существует |
---|---|---|
Нет специальных флагов | Ошибка, errno=ENOENT | OK, открывается существующий объект |
O_CREAT | OK, создается новый объект | OK, открывается существующий объект |
O_CREAT|O_EXCL | OK, создается новый объект | Ошибка, errno=EEXIST |
2.4. Разрешения IPC
Новая очередь сообщений, именованный семафор или сегмент разделяемой памяти создается функциями mq_open, sem_open и shm_open, при условии, что аргумент oflag содержит константу O_CREAT. Согласно табл. 2.3, любому из данных типов IPC присваиваются определенные права доступа (permissions), аналогичные разрешениям доступа к файлам в Unix.
При открытии существующей очереди сообщений, семафора или сегмента разделяемой памяти теми же функциями (в случае, когда не указан флаг O_CREAT или указан O_CREAT без O_EXCL и объект уже существует) производится проверка разрешений:
1. Проверяются биты разрешений, присвоенные объекту IPC при создании.
2. Проверяется запрошенный тип доступа (O_RDONLY, O_WRONLY, O_RDWR).
3. Проверяется действующий идентификатор пользователя вызывающего процесса, действующий групповой идентификатор процесса и дополнительные групповые идентификаторы процесса (последние могут не поддерживаться).
Большинством систем Unix производятся следующие конкретные проверки:
1. Если действующий идентификатор пользователя для процесса есть 0 (привилегированный пользователь), доступ будет разрешен.
2. Если действующий идентификатор пользователя процесса совпадает с идентификатором владельца объекта IPC: если соответствующий бит разрешения для пользователя установлен, доступ разрешен, иначе в доступе отказывается.
Под соответствующим битом разрешения мы подразумеваем, например, бит разрешения на чтение, если процесс открывает объект только для чтения. Если процесс открывает объект для записи, должен быть установлен соответственно бит разрешения на запись для владельца (user-write).
3. Если действующий идентификатор группы процесса или один из дополнительных групповых идентификаторов процесса совпадает с групповым идентификатором объекта IPC: если соответствующий бит разрешения для группы установлен, доступ будет разрешен, иначе в доступе отказывается.