C,extern关键字中的共享内存变量

时间:2015-11-19 21:58:34

标签: c valgrind shared-memory

如果我在C中创建共享内存变量,它们放在哪里(堆/堆栈/数据段/ ...)?我使用64位Ubuntu和gcc-4.8以及compilerflag -m32用于32位和这段代码:

segment_id = shmget (IPC_PRIVATE, shared_segment_size, 
                     IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR); 
shared_memory = (char*) shmat (segment_id, 0, 0); 
printf ("shared memory attached at address |%10p\n", shared_memory); 

我得到以下输出:

shared memory attached at address |0xf76de000

然而,valgrind给出了这个:

shared memory attached at address | 0x4039000

为什么呢?共享变量是否与extern关键字有关?如果另一个进程想要使用数据,他可以选择附加内存的位置吗?

1 个答案:

答案 0 :(得分:2)

将共享内存视为与内核管理的内存块无关的进程(以一粒盐为中心)。当您调用shmat()时,请将其视为类似mmap()的操作,该操作会在当前进程的地址空间与共享段之间创建映射。实际上,您可以使用shmat()的第二个参数强制地址为特定值。但如果不这样做,则会自动生成。实际值取决于许多因素,特别是过程的当前内存映射。

因此,在运行独立进程时有一个映射,而在使用valgrind时有另一个映射。对于所有意图和目的,您可以将其视为堆地址 - 它不会成为堆栈空间的一部分。但更好的是,只要忘记堆栈和堆的区别,并将其视为您可以使用的一些内存,只要您按规则执行即可(不要覆盖边界,尊重权限),