shmdt 标记为删除,c,linux

shmdt marked for deletion, c, linux

我正在尝试用 c 语言编写一些代码来处理 linux 中的剪切内存, 而且我不确定何时使用系统调用 shmdt, 以及何时使用 shmctl (segment_id, IPC_RMID, 0);

我看了看shmdt的man page,读到这句话: "shm_nattch 减一。 如果它变为 0 并且该段被标记为删除, 该段已删除。"

手册页提到的标记是什么?是 shmctl (segment_id, IPC_RMID, 0); 吗? 并且意味着 shmctl (segment_id, IPC_RMID, 0); 如果有一个进程仍处于连接状态,则不会分离该段?

如果有人能解释每次调用的作用,我将不胜感激。 谢谢

shmdt() 反转 shmat()-操作。

shmat: 映射进程地址中的共享内存段space

shmdt: 再次取消映射

shmctl (segment_id, IPC_RMID, 0);标记要删除的段,也就是说,它是shmget(..., IPC_CREAT)创建共享内存段的反操作。如果删除时引用计数器为0,则立即删除该段。否则,删除会延迟到最后一个进程取消映射(显式使用 shmdt() 或隐式终止)。

从进程地址取消共享内存映射 space 使用系统调用 shmdt(shared memory start virtual address) 但要删除共享内存段,请使用 shmctl()IPC_RMIDipcs 命令。
共享内存段数据结构在 Linux 内核中维护,因此删除共享内存段意味着从内核中删除或释放数据结构。