C中的共享内存

时间:2013-09-15 17:01:36

标签: c unix shared-memory

我的进程正在访问已创建的共享内存。附加到共享内存的指针是一个包含指针和2或3个变量的结构。

例如:

typedef struct _info_t{
    int id;
    char c;
}info_t;

typedef struct _details_t{
    int buff_id;
    info_t* info;
}details_t;

details_t* details = shmat(shmid,(void*)0,0);
printf("\n %d \n",details->info->id);            // gives me a segmentation fault

2 个答案:

答案 0 :(得分:5)

如果在多个进程之间共享一个内存段,则无法保证它将映射到同一地址,因此您无法将指针存储在共享内存段中。尽量避免使用指针,使用偏移量或数组(如果可能的话)。

答案 1 :(得分:1)

shmat(2)是一个系统调用(在Linux上)。它可能会失败。至少代码

details_t* details = shmat(shmid,(void*)0,0);
if (!details) { perror("shmat"); exit(EXIT_FAILURE); };  

并且您不能(轻松)将指针放在共享内存中,因为该地址特定于每个进程。