UNIX: взаимодействие процессов | страница 23
>1 #include "unpipc.h"
>2 char *
>3 px_ipc_name(const char *name)
>4 {
>5 char *dir, *dst, *slash;
>6 if ((dst = malloc(РАТН_МАХ)) == NULL)
>7 return(NULL);
>8 /* есть возможность задать другое имя каталога с помощью переменной окружения */
>9 if ((dir = getenv("PX IPC_NAME")) == NULL) {
>10 #ifdef POSIX_IPC_PREFIX
>11 dir = POSIX_IPC_PREFIX; /* из "config.h" */
>12 #else
>13 dir = "/tmp/"; /* по умолчанию */
>14 #endif
>15 }
>16 /* имя каталога должно заканчиваться символом '/' */
>17 slash = (dir[strlen(dir) – 1] == '/') ? "" : "/";
>18 snprintf(dst, PATH_MAX, "%s%s%s", dir, slash, name);
>19 return(dst); /* для освобождения этого указателя можно вызвать free() */
>20 }
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 | Владелец — чтение |