API разделяемой памяти, где процесс может присоединить разделяемую память к другому процессу - PullRequest
0 голосов
/ 16 августа 2011

Может кто-нибудь разобраться в этом и предложить мне API.

У нас есть API для процесса, который может создавать и / или присоединять общую память к своему собственному процессу.Но я не нахожу API для присоединения разделяемой памяти к одному процессу другим процессом (например, процесс A должен вызывать один API (например, shmat ()) для присоединения разделяемой памяти к процессу B).

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Общая память не принадлежит любому конкретному процессу (если вы не создадите ее с помощью закрытого ключа 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: -)

0 голосов
/ 16 августа 2011

Вы просите присоединить память процесса другого процесса, верно?

Просто open(2) файл /proc/<pid>/mem и использовать его.Проверьте /proc/<pid>/map для списка доступных адресов в файле.

0 голосов
/ 16 августа 2011

Давайте посмотрим, разрешить одному процессу принудительно разделить сегмент общей памяти на другой?Что получатель сделает с этим?Как он узнает, что теперь он сопоставил этот блок - что от него ожидается.

Вы думаете о проблеме неверным способом - простое подключение блока памяти ко второму процессу не приведет кпозволит вам делать то, что вы хотите.Вам нужно также уведомить второй процесс о том, что он теперь сопоставил этот блок и поэтому может начать что-то делать с ним.Я предлагаю вам сделать шаг назад и по-настоящему взглянуть на свой дизайн и то, что вы делаете.Мой рекомендуемый подход:

  1. A подключается к B через какой-либо другой IPC (скажем сокет)
  2. A сообщает B, что он должен прикрепить с деталями (имя и т. Д.)
  3. Затем B присоединяется - и теперь B знает об этом и может начать с ним что-то делать.(скажем, например, когда присоединение завершено, B подтверждает A, и затем они могут начать говорить через блок совместно используемой памяти).

Что касается упаковки разделяемой памяти в симпатичную библиотеку - рассмотрите boost ::межпроцессные.

...