解除分配共享内存段

时间:2014-08-26 20:27:12

标签: linux memory-management ipc shared-memory

我有代码

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

如果您使用的是Linux,则应考虑使用POSIX shared memory systemshm_openshm_unlink),它主要使用标准POSIX文件API(mmap,{ {1}}等)与共享内存区域进行交互。它也被称为与您正在使用的旧SYSV接口更加现代化。

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

  

<强> IPC_RMID

     

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