释放共享内存段
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_open
,shm_unlink
),它主要使用标准的POSIX文件API(mmap
,ftruncate
等)进行交互与共享内存区域。它还被认为比您使用的旧 SYSV 界面更现代。
无论如何,销毁 SYSV 段的方法是在分离段之前使用shmctl(shmId, IPC_RMID, NULL)
。来自man 2 shmctl
:
IPC_RMID
标记要销毁的段。该段只有在最后一个进程将其分离后才会真正被销毁(即,当关联结构 shmid_ds 的 shm_nattch 成员为零时)。调用者必须是所有者或创建者,或者具有特权。如果段已被标记为销毁,则将设置 IPC_STAT 检索的相关数据结构中 shm_perm.mode 字段的(非标准)SHM_DEST 标志。 调用者必须确保一个段最终被销毁;否则其出错的页面将保留在内存或交换中。
【讨论】:
以上是关于释放共享内存段的主要内容,如果未能解决你的问题,请参考以下文章