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