Как передать виртуальный адрес функции shmat () гарантированным образом? - PullRequest
1 голос
/ 04 марта 2011

Я использую shmat (), используя виртуальный адрес.

  • первый процесс вызывает shmat с shmaddr как ноль, и когда он получает виртуальный адрес блока данных, он хранится в другом общем месте памяти.

  • второй процесс вызывает shmat () с виртуальным адресом, который был сохранен в общей памяти первым процессом.

  • Второй процесс обычно может подключаться к тому же виртуальному адресу вв большинстве случаев, но в одном случае я не смог и shmat вернул -1, и когда я использовал GDB, я увидел, что адрес является неправильным адресом.

    (gdb) x 0x800852000
    0x800852000:    Error accessing memory address 0x800852000: Bad address.
    

Так что мойВопрос в том, как я могу гарантировать, что при первом получении виртуального адреса увидят оба процесса?

1 Ответ

1 голос
/ 04 марта 2011

В тех случаях, когда вы устанавливаете виртуальный адрес, лучше, если вы установите значение, которое вряд ли будет использоваться в обычном режиме.Скорее всего, вы получили неверный адрес, потому что библиотека или что-то еще заняло все еще до того, как у вас появилась возможность присоединиться.У нас похожая ситуация, и мы заставляем наш адрес 0x0000005000000000 (для 64-битных систем):

void *stuff = shmat(shmid, 0x0000005000000000, SHM_RDONLY);
...