Интерфейс — Очереди сообщений — Семафоры — Разделяемая память

Заголовочный файл —

Тип объекта — mqd_t — sem_t * — int (дескриптор файла)

Создание/открытие — mq_open() — sem_open() — shm_open() + + mmap()

Закрытие — mq_close() — sem_close() — munmap()

Удаление — mq_unlink() — sem_unlink() — shm_unlink()

Выполнение IPC — mq_send(), mq_receive() — sem_post(), sem_wait(), sem_getvalue() — Работа с адресами на разделяемом участке памяти

Прочие операторы — mq_setattr() — устанавливает атрибуты, mq_getattr() — получает атрибуты, mq_notify() — запрашивает уведомление — sem_init() — инициализирует анонимный семафор, sem_destroy() — уничтожает анонимный семафор — (нет)

Имена IPC-объектов

Чтобы получить доступ к объекту POSIX IPC, нужно его как-то распознать. Единственным портируемым средством такой идентификации, предусмотренным стандартом SUSv3, является обращение по имени, которое начинается со слеша, например /myobject. Такой портируемый способ именования IPC-объектов поддерживается в Linux и некоторых других системах (например, в Solaris).

В Linux имена для разделяемой памяти и очередей сообщений POSIX ограничены NAME_MAX (255) символами. Для семафоров это ограничение меньше на четыре символа, поскольку к их именам автоматически добавляется префикс sem.

Стандарт SUSv3 не запрещает использовать имена, не соответствующие формату /myobject, но отмечает, что семантика таких имен определяется конкретной реализацией. Правила именования IPC-объектов могут разниться в некоторых системах. Например, в Tru64 5.1 эти объекты создаются в файловой системе и интерпретируются как полный или относительный путь. Если вызывающий процесс не имеет права создавать файлы в заданном каталоге, то операция open завершится неудачей. Это значит, что в системе Tru64 непривилегированные процессы не могут создавать имена вида /myobject, поскольку им обычно не разрешается изменять содержимое корневого каталога (/). Похожие правила формирования имен, которые можно передавать IPC-вызову open, действуют и в других реализациях. Таким образом, в портируемых приложениях процедуру генерирования имен IPC-объектов следует выносить в отдельные функции или заголовочные файлы, которые можно адаптировать для целевой системы.

Создание или открытие IPC-объекта

У каждого IPC-механизма есть своя операция открытия (mq_open(), sem_open() или shm_open()) — аналог традиционного для UNIX системного вызова open(), предназначенного для работы с файлами. В зависимости от указанного имени IPC-вызов open выполнит одно из этих двух действий:

• создаст новый объект с заданным именем, откроет его и вернет соответствующий дескриптор;

• откроет существующий объект и вернет его дескриптор.

Дескриптор, возвращаемый IPC-вызовом open, аналогичен файловому дескриптору, который возвращается традиционным системным вызовом open(), — он используется в последующих операциях с заданным объектом.

Тип полученного дескриптора зависит от типа объекта. Например, дескриптор очереди сообщений представляет собой структуру данных mqd_t; дескриптором семафора является указатель типа sem_t *; в случае с разделяемой памятью это обычный файловый дескриптор.

Все IPC-вызовы open предусматривают как минимум три аргумента: name, oflag и mode. Рассмотрим их на примере вызова shm_open():

fd = shm_open("/mymem", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);

Данные аргументы аналогичны тем, что используются в традиционном для UNIX системном вызове open(). Аргумент name идентифицирует объект, который нужно создать или открыть. Аргумент oflag представляет собой битовую маску, которая может включать в себя следующие флаги:

• O_CREAT — создает объект, если его еще не существует. Если опустить этот флаг в ситуации, когда заданный объект не был создан заранее, то получим ошибку ENOENT;

• O_EXCL — если объект уже существует и при этом указан флаг O_CREAT, то получим ошибку EEXIST. Проверка существования объекта и его создание — две атомарные операции (см. раздел 5.1). Без O_CREAT данный флаг ни на что не влияет.

В зависимости от типа объекта аргумент oflag может также содержать значения O_RDONLY, O_WRONLY и O_RDWR, похожие на аналогичные константы в вызове open(). Некоторые IPC-механизмы поддерживают дополнительные флаги.

Перейти на страницу:

Похожие книги