Общая память не принадлежит любому конкретному процессу (если вы не создадите ее с помощью закрытого ключа IPC_PRIVATE
). Он принадлежит системе.
Таким образом, когда вы используете shmget
с не закрытым ключом (и флагом IPC_CREAT
), вы либо создаете блок общей памяти, либо присоединяете к существующему.
Вам нужно, чтобы оба процесса использовали один и тот же ключ IPC, и это часто делается с помощью ftok
, который использует спецификацию файла и идентификатор, чтобы дать вам ключ IPC для использования в вызове shmget
(и другие вызовы типа IPC, такие как msgget
или semget
).
Например, в программах pax1
и pax2
у вас может быть сегмент кода, такой как:
int getMyShMem (void) {
key_t mykey = ftok ("/var/pax.cfg", 0); // only one shm block so use id of 0
if (mykey == (key_t)-1) // no go.
return -1;
return shmget (mykey, 1024, IPC_CREAT); // get (or make) a 1K block.
}
Если оба процесса используют одинаковые спецификацию и идентификатор файла, они получат одинаковый блок общей памяти.
Вы можете использовать разные идентификаторы для предоставления вам отдельных блоков совместно используемой памяти, основанных на одном и том же файле (например, вы можете захотеть один для блока конфигурации совместно используемой памяти, а другой для хранения общего состояния).
И, учитывая, что это ваш файл конфигурации, на котором основан ключ IPC, шансы других программ на его использование ничтожны (я думаю, что он может быть нулевым, но я не уверен на 100%).
Вы не можете принудительно внедрить разделяемую память в процесс извне этого процесса (ну, вы можете это сделать, но это может быть опасно и потребовать всевозможных разрешений корневого уровня). Это нарушит модель защищенного процесса и превратит вашу систему в нечто более безопасное, чем MS-DOS: -)