shmat(int id , void * addr,int flg)
的第二个参数被推荐/约定为 NULL。
但是如果我想给它一个特定的地址(void* addr
),该地址应该来自堆栈还是堆?
我的意思是我是否必须 malloc() 然后将该地址传递给 shmat,或者我可以声明 void * adrr(或 char * addr)并将其传递给 shmat。
最佳答案
请看下图:
如果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/