释放共享内存段

Posted

技术标签:

【中文标题】释放共享内存段【英文标题】:deallocating shared memory segment 【发布时间】:2014-08-26 20:27:11 【问题描述】:

我有代码

 int shmId = shmget(key, shmBytes, IPC_CREAT | 0666 );
 shmAddress = (char *) shmat(shmId, NULL, 0);
 /* do some stuff */
 /* detach */
 shmdt(shmAddress);

我的问题是,我是否需要取消分配使用 shmget 获得的段?还是 shmdt 会处理这个问题?

谢谢!

【问题讨论】:

有什么理由在 Linux 上使用 SYSV 共享内存?考虑改用 POSIX 共享内存系统 (shm_open)。它也更明确地删除 (shm_unlink)。 【参考方案1】:

如果你在Linux上,你应该考虑使用POSIX shared memory system(shm_openshm_unlink),它主要使用标准的POSIX文件API(mmapftruncate等)进行交互与共享内存区域。它还被认为比您使用的旧 SYSV 界面更现代。

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

IPC_RMID

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

【讨论】:

以上是关于释放共享内存段的主要内容,如果未能解决你的问题,请参考以下文章

Linux上共享内存的生命周期是多少

Win3内存管理之私有内存跟共享内存的申请与释放

共享内存占用不释放

C ++释放共享库中动态分配的内存导致崩溃

共享内存实现上的 C++ 内存池:这种分配和释放方法是不是正确?

Swift 5:如何释放由共享库分配的内存