首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放共享内存段

释放共享内存段
EN

Stack Overflow用户
提问于 2014-08-26 20:27:11
回答 1查看 1.4K关注 0票数 1

我有代码

代码语言:javascript
复制
 int shmId = shmget(key, shmBytes, IPC_CREAT | 0666 );
 shmAddress = (char *) shmat(shmId, NULL, 0);
 /* do some stuff */
 /* detach */
 shmdt(shmAddress);

我的问题是,我是否需要取消我在shmget中得到的部分?或者是shmdt负责这件事?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-26 20:44:30

如果您在Linux上,您应该考虑使用POSIX共享内存系统 (shm_openshm_unlink),它主要使用标准的POSIX文件API (mmapftruncate等)。与共享内存区域交互。它还被注意到作为您正在使用的旧的SYSV接口更加现代化。

无论如何,破坏SYSV段的方法是在分离段之前使用shmctl(shmId, IPC_RMID, NULL)。来自man 2 shmctl

IPC_RMID 标记要销毁的部分。只有在最后一个进程分离它之后(即当关联结构的shm_nattch成员shmid_ds为零时),该段才会被实际销毁。调用方必须是所有者或创建者,或具有特权。如果一个段被标记为销毁,则将设置由SHM_DEST检索的关联数据结构中shm_perm.mode字段的(非标准) IPC_STAT标志。调用方必须确保某个段最终被销毁;否则,其出现故障的页面将留在内存或交换中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25514599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档