posix_typed_mem_open()

Открытие объекта в типизированной памяти

Прототип:

#include <sys/mman.h>
int posix_typed_mem_open( const char *name,
int oflag,
int tflag );

Аргументы:

name
Указатель на строку, определяющую типизированный объект памяти.
oflag
Используемый режим доступа из списка:
O_RDONLY
Открыто только для чтения.
O_WRONLY
Открыто только для записи.
O_RDWR
Открыто для чтения или записи.
tflag
Флаги, определяющие поведение типизированного объекта памяти при выделении, не более одного из списка:
POSIX_TYPED_MEM_ALLOCATE
Выделить через mmap().
POSIX_TYPED_MEM_ALLOCATE_CONTIG
Выделить непрерывно через mmap().
POSIX_TYPED_MEM_MAP_ALLOCATABLE
Выдалить через mmap(), не влияя на доступность для распределения.

Библиотека:

libc

Описание:

Функция posix_typed_mem_open() устанавливает связь между типизированным объектом памяти, указанным в name, и файловым дескриптором. Он создает описание открытого файла, которое ссылается на типизированный объект памяти, и дескриптор файла, который ссылается на описание открытого файла.

Имена типизированных областей памяти получаются непосредственно из имен сегментов asinfo. Сам раздел asinfo описывает иерархию, поэтому именование типизированного объекта памяти является иерархией.

Функция posix_typed_mem_open() принимает имена следующим образом:

  1. Если имя начинается с префикса /, устанавливает связь с помощью точного совпадения.

  2. Имя может содержать промежуточные символы /. Они считаются разделителями компонентов пути. Если указано несколько компонентов пути, они сопоставляются снизу вверх (противоположно тому, как записываются имена).

  3. Если имя не начинается с начального /, для указанных компонентов пути устанавливается связь путем нахождения совпадений в конце имени.

Дескриптор файла используется другими функциями для ссылки на этот типизированный объект памяти.

Установка tflag влияет на то, что происходит, когда вы вызываете mmap() с файловым дескриптором для типизированного объекта памяти:

POSIX_TYPED_MEM_ALLOCATE
Функция mmap() выделяет и отображает типизированную память из указанного пула типизированной памяти. Выделенная память представляет собой либо ранее нераспределенную непрерывную область типизированного пула памяти, либо несколько несмежных ранее нераспределенных областей (отображенных в непрерывную часть адресного пространства процесса).
POSIX_TYPED_MEM_ALLOCATE_CONTIG
Функция mmap() выделяет и отображает ранее нераспределенную единую непрерывную область типизированного пула памяти (также отображаемую на непрерывную часть адресного пространства процесса).
Ни POSIX_TYPED_MEM_ALLOCATE, ни POSIX_TYPED_MEM_ALLOCATE_CONTIG
Функция mmap() отображает выбранную приложением область из указанного типизированного пула памяти.

Note: Отображенная область памяти недоступна для выделения, пока все процессы не отключат ее.

POSIX_TYPED_MEM_MAP_ALLOCATABLE
Функция mmap() отображает выбранную приложением область из указанного пула типизированной памяти, не влияя на доступность этой области для выделения; то есть отображение такого объекта оставляет каждый байт отображаемой области нераспределенным, если он не был выделен до отображения, или выделенным, если он был выделен до отображения.

Если tflag равен 0 или POSIX_TYPED_MEM_MAP_ALLOCATABLE, параметр смещения для mmap() указывает начальный физический адрес в типизированной области памяти; если типизированная область памяти является несмежной (несколько записей asinfo), допустимые значения смещения также являются несмежными и не начинаются с нуля, как для объектов с общей памятью. Если указана область [paddr, paddr + size), которая выходит за пределы разрешенных адресов для типизированного объекта памяти, mmap() завершается ошибкой с ENXIO.

Параметр oflag определяет, с какими разрешениями вам разрешено использовать mmap(). Например, если oflag равен O_RDONLY, вы не можете выполнить mmap() с MAP_SHARED и PROT_WRITE.

В случае успеха posix_typed_mem_open() возвращает дескриптор файла для типизированного объекта памяти, который является файловым дескриптором с наименьшим номером, не открытым в данный момент для этого процесса. Дескриптор открытого файла является новым и не используется никакими другими процессами. Флаг дескриптора файла FD_CLOEXEC, связанный с новым дескриптором файла, очищается.

Функции mmap(), posix_mem_offset(), posix_typed_mem_get_info(), fstat(), dup(), dup2() и close() могут работать с дескриптором файла, который возвращает posix_typed_mem_open().

Расширения ЗОСРВ «Нейтрино»:

Возвращаемое значение:

Неотрицательное целое, представляющее неиспользуемый файловый дескриптор с минимальным номером. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EACCES
Типизированный объект памяти существует, но разрешения на указанные в oflag операции отсутствуют.
EINTR
Функция posix_typed_mem_open() была прервана сигналом.
EINVAL
Флаги, указанные в tflag, недействительны (указано более одного флага).
EMFILE
Процесс использует слишком много файловых дескрипторов.
ENAMETOOLONG
Длина аргумента name превышает PATH_MAX, или компонент пути name длиннее, чем NAME_MAX.
ENFILE
В системе открыто слишком много файловых дескрипторов.
ENOENT
Указанный типизированный объект памяти не существует.
EPERM
Вызывающий не обладает правами суперпользователя для указания флага POSIX_TYPED_MEM_MAP_ALLOCATABLE в аргументе tflag.

Классификация:

POSIX 1003.1 Typed Memory Objects

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

close(), dup(), dup2(), fstat(), ftruncate(), mmap(), msync(), posix_mem_offset(), posix_typed_mem_get_info()




Предыдущий раздел: Описание API системной библиотеки