我有代码
int shmId = shmget(key, shmBytes, IPC_CREAT | 0666 );
shmAddress = (char *) shmat(shmId, NULL, 0);
/* do some stuff */
/* detach */
shmdt(shmAddress);
我的问题是,我是否需要取消分配我使用shmget获得的片段?还是shmdt会照顾这个?
谢谢!
答案 0 :(得分:3)
如果您使用的是Linux,则应考虑使用POSIX shared memory system(shm_open
,shm_unlink
),它主要使用标准POSIX文件API(mmap
,{ {1}}等)与共享内存区域进行交互。它也被称为与您正在使用的旧SYSV接口更加现代化。
无论如何,销毁SYSV段的方法是在分离段之前使用ftruncate
。来自man 2 shmctl
:
<强> IPC_RMID 强>
标记要销毁的细分。该段仅在最后一个进程分离之后才被实际销毁(即,当相关结构shmid_ds的shm_nattch成员为零时)。呼叫者必须是所有者或创建者,或具有特权。如果段已被标记为销毁,则将设置IPC_STAT检索的关联数据结构中的shm_perm.mode字段的(非标准)SHM_DEST标志。 调用者必须确保段最终被销毁;否则其故障的页面将保留在内存或交换中。