如果我在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关键字有关?如果另一个进程想要使用数据,他可以选择附加内存的位置吗?
答案 0 :(得分:2)
将共享内存视为与内核管理的内存块无关的进程(以一粒盐为中心)。当您调用shmat()
时,请将其视为类似mmap()
的操作,该操作会在当前进程的地址空间与共享段之间创建映射。实际上,您可以使用shmat()
的第二个参数强制地址为特定值。但如果不这样做,则会自动生成。实际值取决于许多因素,特别是过程的当前内存映射。
因此,在运行独立进程时有一个映射,而在使用valgrind时有另一个映射。对于所有意图和目的,您可以将其视为堆地址 - 它不会成为堆栈空间的一部分。但更好的是,只要忘记堆栈和堆的区别,并将其视为您可以使用的一些内存,只要您按规则执行即可(不要覆盖边界,尊重权限),