Общая память Linux

Функция, которая создает разделяемую память в программировании *inux, принимает ключ в качестве одного из своих параметров.

В чем смысл этого ключа? И как я могу его использовать?

Редактировать:

Идентификатор не общей памяти


person Betamoo    schedule 11.05.2010    source источник


Ответы (2)


Это просто ключ System V IPC (межпроцессное взаимодействие), поэтому разные процессы могут создавать или присоединяться к одному и тому же блоку общей памяти. Ключ обычно создается с помощью ftok(), который превращает полностью указанное имя файла и идентификатор проекта в пригодный для использования ключ.

Поскольку приложение обычно может использовать одно и то же имя файла во всех своих различных процессах (имя файла часто является файлом конфигурации, связанным с вашим приложением), каждый отдельный процесс получает один и тот же ключ (или, что более вероятно, если вы используете идентификатор проекта для указания нескольких общих сегменты памяти, тот же набор ключей).

Например, когда-то у нас было приложение, которое использовало файл конфигурации, обработанный нашим кодом lex/yacc, поэтому мы просто использовали это имя пути и один идентификатор проекта для каждого отдельного блока общей памяти (их было три или четыре в зависимости от цели процесса в вопрос). На самом деле это имело большой смысл, поскольку именно проанализированные и оцененные данные из этого файла конфигурации хранились в блоках общей памяти.

Поскольку никакое другое приложение в системе не должно использовать наш файл конфигурации для создания ключа, конфликта не возникло. Сам ключ не ограничивается разделяемой памятью, его также можно использовать для семафоров и других механизмов IPC.

person paxdiablo    schedule 11.05.2010
comment
Да, ключ обычно создается с помощью 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, который достигает почти того же.

person MarkR    schedule 11.05.2010