Shmat с ненулевым shmaddr - PullRequest
       17

Shmat с ненулевым shmaddr

3 голосов
/ 09 февраля 2010

Может ли кто-нибудь привести пример (разумно) использования функции shmat () с ненулевым вторым параметром?

В инструкции написано:

#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

Функция shmat () присоединяет сегмент общей памяти, связанный с идентификатором общей памяти shmid, к сегменту данных вызывающего процесса. Сегмент прикрепляется по адресу, указанному по одному из следующих критериев:

  • Если shmaddr является указателем NULL, сегмент прикрепляется по первому доступному адресу, выбранному системой.
  • Если shmaddr не является указателем NULL и (shmflg & SHM_RND) не равен нулю, сегмент присоединяется по адресу, указанному в (shmaddr - (shmaddr% SHMLBA)).
  • Если shmaddr не является указателем NULL и (shmflg & SHM_RND) равно 0, сегмент присоединяется по адресу, указанному shmaddr.

но я никогда не видел ни одного примера shmat, используемого с чем-либо, кроме shmaddr, установленным в NULL. В моем проекте процесс должен был присоединить его к malloc() 'редактируемому фрагменту памяти, и он мог бы использовать его очень хорошо, тогда другой процесс получил указатель на эту общую память (по shmid), затем segfaults при попытке получить доступ к памяти.

Ответы [ 2 ]

3 голосов
/ 09 февраля 2010

Идея состоит в том, чтобы разделить сегмент в одном и том же виртуальном адресе в разных процессах, чтобы они могли использовать простые указатели (а не смещения) для адресации элементов в общей памяти. Общий сценарий для одного «главного» процесса - сопоставить память по предоставленному ядром адресу (второй аргумент ноль), а затем передать этот адрес «рабочим» процессам через некоторый внеполосный канал (например, аргумент команды с помощью fork / exec, сокета UNIX, FIFO и т. д.), а затем «рабочие» пытаются сопоставить сегмент по этому адресу. Опять же, идея заключается в том, что, если ядро ​​могло отображать совместно используемую память на данном виртуальном устройстве для «главного», тот же адрес должен подойти для «рабочих» процессов.

У меня нет «разумного» примера для указания. Вы можете посмотреть, как Postgres работает с общей памятью. Хотя это немного запутанно.

0 голосов
/ 09 февраля 2010

Я предполагаю, что вы можете разделить структуру с абсолютными указателями в ней.

Но у меня нет примеров кода.

...