Книга: UNIX: взаимодействие процессов
2.3. Создание и открытие каналов IPC
2.3. Создание и открытие каналов IPC
Все три функции, используемые для создания или открытия объектов IPC: mq_open, sem_open и shm_open, — принимают специальный флаг oflag в качестве второго аргумента. Он определяет параметры открытия запрашиваемого объекта аналогично второму аргументу стандартной функции open. Все константы, из которых можно формировать этот аргумент, приведены в табл. 2.2.
Таблица 2.2. Константы, используемые при создании и открытии объектов IPC
Описание | mq_open | sem_open | shm_open |
---|---|---|---|
Только чтение | О_RDONLY | О_RDONLY | |
Только запись | О_WRONLY | ||
Чтение и запись | О_RDWR | О_RDWR | |
Создать, если не существует | О_CREAT | О_CREAT | О_CREAT |
Исключающее создание | О_EXCL | О_EXCL | О_EXCL |
Без блокировки | О_NONBLOCK | ||
Сократить (truncate) существующий | O_TRUNC |
Первые три строки описывают тип доступа к создаваемому объекту: только чтение, только запись, чтение и запись. Очередь сообщений может быть открыта в любом из трех режимов доступа, тогда как для семафора указание этих констант не требуется (для любой операции с семафором требуется доступ на чтение и запись). Наконец, объект разделяемой памяти не может быть открыт только на запись.
Указание прочих флагов из табл. 2.2 не является обязательным.
O_CREAT — создание очереди сообщений, семафора или сегмента разделяемой памяти, если таковой еще не существует (см. также флаг O_EXCL, влияющий на результат).
При создании новой очереди сообщений, семафора или сегмента разделяемой памяти требуется указание по крайней мере одного дополнительного аргумента, определяющего режим. Этот аргумент указывает биты разрешения на доступ к файлу и формируется путем побитового логического сложения констант из табл. 2.3.
Таблица 2.3. Константы режима доступа при создании нового объекта IPC
Константа | Описание |
---|---|
S_IRUSR | Владелец — чтение |
S_IWUSR | Владелец — запись |
S_IRGRP | Группа — чтение |
S_IWGRP | Группа — запись |
S_IROTH | Прочие — чтение |
S_IWOTH | Прочие — запись |
Эти константы определены в заголовке <sys/stat.h>. Указанные биты разрешений изменяются наложением маски режима создания файлов для данного процесса (с. 83-85 [21]) или с помощью команды интерпретатора umask.
Как и со вновь созданным файлом, при создании очереди сообщений, семафора или сегмента разделяемой памяти им присваивается идентификатор пользователя, соответствующий действующему (effective) идентификатору пользователя процесса. Идентификатор группы семафора или сегмента разделяемой памяти устанавливается равным действующему групповому идентификатору процесса или групповому идентификатору, установленному по умолчанию для системы в целом. Групповой идентификатор очереди сообщений всегда устанавливается равным действующему групповому идентификатору процесса (на с. 77-78 [21] рассказывается о групповых и пользовательских идентификаторах более подробно).
ПРИМЕЧАНИЕ
Кажется странным наличие разницы в установке группового идентификатора для разных видов Posix IPC. Групповой идентификатор нового файла, создаваемого с помощью функции open, устанавливается равным либо действительному идентификатору группы процесса, либо идентификатору группы каталога, в котором создается файл, но функции IPC не могут заранее предполагать, что для объекта IPC создается реальный файл в файловой системе.
O_EXCL — если этот флаг указан одновременно с O_CREAT, функция создает новую очередь сообщений, семафор или объект разделяемой памяти только в том случае, если таковой не существует. Если объект уже существует и указаны флаги O_CREAT | O_EXCL, возвращается ошибка EEXIST.
Проверка существования очереди сообщений, семафора или сегмента разделяемой памяти и его создание (в случае отсутствия) должны производиться только одним процессом. Два аналогичных флага имеются и в System V IPC, они описаны в разделе 3.4.
O_NONBLOCK — этот флаг создает очередь сообщений без блокировки. Блокировка обычно устанавливается для считывания из пустой очереди или записи в полную очередь. Об этом более подробно рассказано в подразделах, посвященных функциям mq_send и mq_receive раздела 5.4.
O_TRUNC — если уже существующий сегмент общей памяти открыт на чтение и запись, этот флаг указывает на необходимость сократить его размер до 0.
На рис. 2.1 показана реальная последовательность логических операций при открытии объекта IPC. Что именно подразумевается под проверкой разрешений доступа, вы узнаете в разделе 2.4. Другой подход к изображенному на рис. 2.1 представлен в табл. 2.4.
Рис. 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 Posix IPC
- ГЛАВА 3 System V IPC
- 3.4. Создание и открытие каналов IPC
- Создание файлов с блокировкой
- Создание свободно позиционируемых элементов
- 12. Лекция: Создание приложений с графическим интерфейсом пользователя.
- Создание объектов Collection
- 7.4.2.4. Создание своего первого LiveCD
- 4.2. Создание трехмерной модели и построение горизонтальной проекции детали
- 5.12.2 Открытие поименованного канала
- 7.4.2. Создание собственного LiveCD
- Создание пользователя и группы на рабочей станции