c - shmdt 标记为删除,c,linux

标签 c linux shared-memory

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

我查看了 shmdt 的手册页,读到这句话: “shm_nattch 减一。 如果它变为 0 并且该段被标记为删除, 该段已删除。”

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

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

最佳答案

shmdt() 反转 shmat() 操作。

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

shmdt:再次取消映射

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

关于c - shmdt 标记为删除,c,linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34992888/

相关文章:

java - 调整直接缓冲内存的大小

c++ - Source Insight 3.5 显示 .c 文件的 "Parse Too complex"

C - 并行写入和读取 FIFO 文件 - 意外行为

java - 如何在 HDFS Hadoop (Cloudera) java 中创建目录到文件

linux - Linux脚本中如何将状态输出成多个文本?

c - 消息队列。 msgsend msgrcv。 C 语言中的 System V IPC 系统调用 (Linux)

c++ - 观察 QSharedMemory 的变化

C:数组结构中的结构数组

c - 如何在 CANbus RX/TX FIFO 起始地址寄存器 (ATSAME51) 的特定地址处初始化数组?

c - 我们必须使用 C "for performance reasons"