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 
Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Создание и открытие

Из книги Pinnacle Studio 11 автора Чиртик Александр Анатольевич

Создание и открытие Создание и открытие проекта аналогичны таким же действиям в любой программе, работающей с сохраняемыми на диск документами, например с текстовым редактором (Блокнот, Microsoft Word).Если в параметрах проектов не установлен флажок Авт. сохранять и загружать


Создание, сохранение и открытие проекта

Из книги ArchiCAD. Начали! автора Орлов Андрей Александрович

Создание, сохранение и открытие проекта Создать новый файл проекта можно с помощью одного из следующих действий: Рис. 1.2. Рабочая среда программы ArchiCAD? нажать кнопку расположенную на панели инструментов Standard (Стандартная);? выполнить команду File ? New (Файл ? Создать) меню


Открытие и создание файлов

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

Открытие и создание файлов После создания объекта класса CFile можно открыть файл, вызвав метод Open. Методу Open надо указать путь к открываемому файлу и режим его использования. Прототип метода Open имеет следующий вид:virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);В качестве


Изображение. Его создание, открытие и параметры

Из книги Photoshop CS3: Обучающий курс автора Тимофеев Сергей Михайлович

Изображение. Его создание, открытие и параметры Базовым элементом при работе в Adobe Photoshop, объектом является само изображение, которое мы создаем или редактируем. После загрузки программы появляется лишь сам редактор с уже рассмотренными нами основными элементами


3.4. Создание и открытие каналов IPC

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

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


Создание и открытие файла

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Создание и открытие файла Поскольку данная функция является первой из функций Windows, к изучению которых мы приступаем, ее описание будет несколько более подробным по сравнению с остальными; для других функций часто будут приводиться лишь краткие описания. Вместе с тем,


Создание именованных каналов

Из книги Веб-Самоделкин. Как самому создать сайт быстро и профессионально автора Гладкий Алексей Анатольевич

Создание именованных каналов Серверами именованных каналов могут быть только системы на основе Windows NT (как обычно, здесь имеются в виду версия 4.0 и последующие); системы на базе Windows 9x могут выступать только в роли клиентов.Прототип функции CreateNamedPipe представлен ниже. HANDLE


Создание и открытие почтового ящика

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Создание и открытие почтового ящика Для создания почтового ящика и получения дескриптора, который можно будет использовать в операциях ReadFile, почтовые серверы (программы считывания) вызывают функцию CreateMailslot. На одном компьютере может находиться только один почтовый


Создание, подключение и именование каналов и почтовых ящиков

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Создание, подключение и именование каналов и почтовых ящиков В табл. 11.1 сведены все допустимые формы имен каналов, которые могут использоваться клиентами и серверами приложения. Здесь же перечислены все функции, которые следует использовать для создания именованных


Создание, открытие и сохранение веб-страниц

Из книги Linux программирование в примерах автора Роббинс Арнольд

Создание, открытие и сохранение веб-страниц С помощью программы вы можете создавать новые веб-страницы, а также редактировать созданные ранее.Чтобы создать новую веб-страницу, нужно выполнить команду главного меню Файл ?


Создание, открытие и сохранение документов

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Создание, открытие и сохранение документов Чтобы начать работу с документом, его необходимо вначале создать. Как мы уже отмечали ранее, программа по умолчанию создает новый документ при запуске, однако в процессе работы может потребоваться последовательное создание


11.4.1. Создание входных точек устройств и именованных каналов

Из книги автора

11.4.1. Создание входных точек устройств и именованных каналов Процессы создают файлы устройств и именованных каналов в файловой системе с помощью вызова mknod().#include <fcntl.h>#include <unistd.h>int mknod(const char *pathname, mode_t mode, dev_t dev);pathname — это имя файла, который нужно создать, mode — это и


11.6. Создание неименованных каналов

Из книги автора

11.6. Создание неименованных каналов Неименованные каналы подобны именованным, но они в файловой системе не существуют. Они не имеют путевых имен, ассоциированных с ними, и все они и их следы исчезают после того, как последний файловый дескриптор, ссылающийся на них,


5.4.1. Создание каналов

Из книги автора

5.4.1. Создание каналов Канал создается с помощью функции pipe(). Ей необходимо передать массив из двух целых чисел. В элементе с индексом 0 функция сохраняет дескриптор файла, соответствующего выходному концу канала, а в элементе с индексом 1 сохраняется дескриптор файла,