我有代码
int shmId = shmget(key, shmBytes, IPC_CREAT | 0666 );
shmAddress = (char *) shmat(shmId, NULL, 0);
/* do some stuff */
/* detach */
shmdt(shmAddress);我的问题是,我是否需要取消我在shmget中得到的部分?或者是shmdt负责这件事?
谢谢!
发布于 2014-08-26 20:44:30
如果您在Linux上,您应该考虑使用POSIX共享内存系统 (shm_open,shm_unlink),它主要使用标准的POSIX文件API (mmap、ftruncate等)。与共享内存区域交互。它还被注意到作为您正在使用的旧的SYSV接口更加现代化。
无论如何,破坏SYSV段的方法是在分离段之前使用shmctl(shmId, IPC_RMID, NULL)。来自man 2 shmctl
IPC_RMID 标记要销毁的部分。只有在最后一个进程分离它之后(即当关联结构的shm_nattch成员shmid_ds为零时),该段才会被实际销毁。调用方必须是所有者或创建者,或具有特权。如果一个段被标记为销毁,则将设置由SHM_DEST检索的关联数据结构中shm_perm.mode字段的(非标准) IPC_STAT标志。调用方必须确保某个段最终被销毁;否则,其出现故障的页面将留在内存或交换中。
https://stackoverflow.com/questions/25514599
复制相似问题