c - 了解进程内存的 shmat 和附件?

标签 c linux memory-management ipc shared-memory

shmat(int id , void * addr,int flg) 的第二个参数被推荐/约定为 NULL。

但是如果我想给它一个特定的地址(void* addr),该地址应该来自堆栈还是堆?

我的意思是我是否必须 malloc() 然后将该地址传递给 shmat,或者我可以声明 void * adrr(或 char * addr)并将其传递给 shmat。

最佳答案

请看下图:

enter image description here

如果addr 为NULL,系统会选择第一个可用地址而不破坏BSS 段。很可能会在堆中。所以你不需要分配。

如果 addr 来自您应用程序的堆栈段,调用 shmat 将破坏堆栈。这很可能会导致您的程序出现段错误。 shmat 将覆盖堆栈中位于低于您作为参数提供的地址的变量。

因此,如果您想发送一个地址,如果该地址来自堆,您就有更好的机会不破坏任何东西。与堆栈的情况一样,您可以覆盖驻留在堆中的数据,但您不希望这样。但通常堆空间填充得更“稀疏”。

如果你真的不想使用NULL,你可以在堆上分配一些内存,并将指针指向刚刚分配的内存。确保分配正确的尺寸。

我粘贴了与shmat相关的文档:

If shmaddr isn't NULL and SHM_RND is specified in shmflg, the attach occurs at the address equal to shmaddr rounded down to the nearest multiple of SHMLBA. Otherwise shmaddr must be a page-aligned address at which the attach occurs

因此,即使您为附加共享内存段提供了一个非空地址,它也必须是页面对齐的。否则将向下舍入。

关于c - 了解进程内存的 shmat 和附件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29580251/

相关文章:

c - 如何找到缓存友好代码中的未命中率?

css - 为什么 Linux 上的 Chrome 显示错误的字体粗细?

php - linux 上的 blueimp jquery 上传删除不起作用

c - 怎么用 smashed stack 启动代码?

java - JVMTI 分析 : calculating the amount of stack memory

c - 如何设置 if 以检查 C 中的多个值?

在源中配置 clang-format

C++:以下代码有什么问题吗?

c - 打包/解包缓冲区

c++ - 带有 gcc 4.4.7 的 CentOS 5.8 链接到 libstdc++ 6.0.8。这怎么可能?