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_opensem_openshm_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Владелец — чтение