【问题标题】: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)。

标签: linux memory-management ipc shared-memory


【解决方案1】:

如果你在Linux上,你应该考虑使用POSIX shared memory systemshm_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 标志。 调用者必须确保一个段最终被销毁;否则其出错的页面将保留在内存或交换中。

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 2015-01-25
    • 2012-05-03
    • 1970-01-01
    • 2013-05-20
    • 2021-09-19
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多