C 中的共享内存变量,extern 关键字
Shared memory variables in C, extern keyword
如果我在 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 关键字有什么关系吗?如果另一个进程要使用数据,他可以选择附加内存的位置吗?
将共享内存视为由内核管理的独立于进程(持保留态度)的内存块。当您调用 shmat()
时,可以将其视为类似 mmap()
的操作,在当前进程的地址 space 和共享段之间创建映射。事实上,您可以使用 shmat()
的第二个参数强制地址为特定值。但如果你不这样做,它会自动生成。实际值将取决于许多因素,尤其是进程的当前内存映射。
因此,当您 运行 进程独立时,您有一个映射,而当使用 valgrind 时,您有另一个映射。出于所有意图和目的,您可以将其视为堆地址——它不会成为堆栈的一部分 space。但更好的是,忘记堆栈和堆的区别,把它当作你得到的一些内存,只要你遵守规则就可以玩(不要覆盖边界,尊重权限),
如果我在 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 关键字有什么关系吗?如果另一个进程要使用数据,他可以选择附加内存的位置吗?
将共享内存视为由内核管理的独立于进程(持保留态度)的内存块。当您调用 shmat()
时,可以将其视为类似 mmap()
的操作,在当前进程的地址 space 和共享段之间创建映射。事实上,您可以使用 shmat()
的第二个参数强制地址为特定值。但如果你不这样做,它会自动生成。实际值将取决于许多因素,尤其是进程的当前内存映射。
因此,当您 运行 进程独立时,您有一个映射,而当使用 valgrind 时,您有另一个映射。出于所有意图和目的,您可以将其视为堆地址——它不会成为堆栈的一部分 space。但更好的是,忘记堆栈和堆的区别,把它当作你得到的一些内存,只要你遵守规则就可以玩(不要覆盖边界,尊重权限),