如何在2个进程之间分配system-V共享内存

how to allocate system-V shared memory between 2 process

最近,我尝试在 2 个进程(主机和来宾)之间创建 shared_memory, 和一个名为 my_shared 的结构在此内存中分配。 但是结构有一个指针int *,我需要指出一个 对他的部分记忆,这是我的代码:

shared.h

#define KEY 5114
struct my_shared{
    int *a;
    int b;
};
void *mem;

host.c

#include <...>
#include "shared.h"

struct my_shared *st;

int main(void)
{
    int id;
    key_t key = KEY;

    id = shmget(key, 1024, 0666|IPC_CREAT|IPC_EXCL);//1K shared memory
    if(id < 0){/* do error handle */}

    mem = shmat(id, (void *)0, 0);
    if(mem == MAP_FAILED){/* do error handle */}

    //point out the shared memory base address
    st = (struct my_shared *)mem;
    //point out the int *a memory address
    st->a = (int *)(mem + sizeof(struct my_shared));

    //read-write the memory
    int i = 0;
    do{
       st->b = i++;
       *(st->a) = ++i;
       printf("a = %d, b = %d\n", st->b, *(st->a));
       sleep(1);
    }while(1);

    shmdt(st);
    return 0;
}

guest.c

#include <...>
#include "shared.h"

struct my_shared *st;

int main(void)
{
    int id;
    key_t key = KEY;

    id = shmget(key, 1024, 0); //1K shared memory
    if(id < 0){/* do error handle */}

    mem = shmat(id, (void *)0, 0);
    if(mem == MAP_FAILED){/* do error handle */}

    //point out the shared memory base address
    st = (struct my_shared *)mem;
    //point out the int *a memory address
    st->a = (int *)(mem + sizeof(struct my_shared));

    //read the memory
    do{
       printf("a = %d, b = %d\n", st->b, *(st->a));
       sleep(3);
    }while(1);

    shmdt(st);
    return 0;
}

如果只执行host就可以了,但是当执行guest读取*(st->b)会导致host crush,gdb说*(st->a ) 无法访问 host

如果我修改代码,让hostguest只访问st->b,就可以了!

为什么访问*(st->a)会压垮?我是不是丢了什么东西?

我的环境是 ubuntu 14.04LTS with gcc4.8.5

在共享内存中传递指针是行不通的,因为块通常位于每个进程中的不同地址。

但是有一个解决方案:传递指针本身和共享块指针之间的差异。这样,客户端只需将其基址添加到其中的值,并拥有指向数据的有效指针。当然,服务器中的指针必须指向同一共享内存块内的区域。