Функция, которая создает разделяемую память в программировании *inux, принимает ключ в качестве одного из своих параметров.
В чем смысл этого ключа? И как я могу его использовать?
Редактировать:
Идентификатор не общей памяти
Функция, которая создает разделяемую память в программировании *inux, принимает ключ в качестве одного из своих параметров.
В чем смысл этого ключа? И как я могу его использовать?
Редактировать:
Идентификатор не общей памяти
Это просто ключ System V IPC (межпроцессное взаимодействие), поэтому разные процессы могут создавать или присоединяться к одному и тому же блоку общей памяти. Ключ обычно создается с помощью ftok()
, который превращает полностью указанное имя файла и идентификатор проекта в пригодный для использования ключ.
Поскольку приложение обычно может использовать одно и то же имя файла во всех своих различных процессах (имя файла часто является файлом конфигурации, связанным с вашим приложением), каждый отдельный процесс получает один и тот же ключ (или, что более вероятно, если вы используете идентификатор проекта для указания нескольких общих сегменты памяти, тот же набор ключей).
Например, когда-то у нас было приложение, которое использовало файл конфигурации, обработанный нашим кодом lex/yacc, поэтому мы просто использовали это имя пути и один идентификатор проекта для каждого отдельного блока общей памяти (их было три или четыре в зависимости от цели процесса в вопрос). На самом деле это имело большой смысл, поскольку именно проанализированные и оцененные данные из этого файла конфигурации хранились в блоках общей памяти.
Поскольку никакое другое приложение в системе не должно использовать наш файл конфигурации для создания ключа, конфликта не возникло. Сам ключ не ограничивается разделяемой памятью, его также можно использовать для семафоров и других механизмов IPC.
ftok
(см. netbsd.gw.com/cgi-bin/man-cgi?ftok+3+NetBSD-current) и используется с shmget
. Используя ключ, shmget
может либо создать общий сегмент, либо получить существующий сегмент, идентифицированный с помощью ключа, в зависимости от переданных вами флагов (см. netbsd.gw.com/cgi-bin/man-cgi?shmget+2+NetBSD-current).
- person tonio; 11.05.2010
Функции разделяемой памяти posix (shm_open и подобные) имеют более удобный интерфейс, поскольку они могут принимать уникальное имя файла, которое должно использоваться приложениями для открытия одного и того же блока разделяемой памяти.
Сказав это, как правило, также возможно открыть файл в /dev/shm под Linux, а затем mmap его с помощью MAP_SHARED, который достигает почти того же.