我正在尝试用c编写一些代码来处理linux中的剪切内存,
而且我不确定何时使用系统调用shmdt
,
何时使用shmctl (segment_id, IPC_RMID, 0);
我查看了shmdt的手册页,并阅读了这句话: “shm_nattch减1。 如果它变为0并且该段被标记为删除, 该段被删除。“
手册页提到的标记是什么?是shmctl (segment_id, IPC_RMID, 0);
吗?
和剂量是否表示如果某个流程仍然连接,shmctl (segment_id, IPC_RMID, 0);
将不会分离该段?
如果有人能解释每次通话的剂量,我将不胜感激。 感谢
答案 0 :(得分:3)
shmdt()
撤销shmat()
- 操作。
shmat:映射进程地址空间中的共享内存段
shmdt:再取消映射
shmctl (segment_id, IPC_RMID, 0);
标记要删除的段,这意味着,它是使用shmget(..., IPC_CREAT)
创建共享内存段的反操作。如果删除时引用计数器为0,则立即删除该段。否则,删除将被推迟,直到最后一个进程取消映射(使用shmdt()
显式或通过终止隐式)。
答案 1 :(得分:0)
从进程地址空间使用系统调用取消映射共享内存映射
shmdt(shared memory start virtual address)
但要删除共享内存段,请使用shmctl()
或IPC_RMID
命令{。}}。
共享内存段数据结构在Linux内核中维护,因此删除共享内存段意味着从内核中删除或释放数据结构。