我试图在linux中用c++编写一些处理剪切内存的代码,我不确定何时使用系统调用shmdt,何时使用shmctl (segment_id, IPC_RMID, 0);
我看了一下shmdt的手册页,读到这句话:"shm_nattch减少1,如果它变成0,段被标记为删除,则段被删除。“
手册上提到的标记是什么?是shmctl (segment_id, IPC_RMID, 0);吗?这是否意味着如果还存在一个连接的过程,shmctl (segment_id, IPC_RMID, 0);就不会分离这个部分?
如果有人能解释一下每个电话是干什么的,我会很感激的。谢谢
发布于 2016-01-25 13:02:36
shmdt()逆转shmat()-operation。
shmat:映射进程地址空间中的共享内存段
shmdt:再次取消映射
shmctl (segment_id, IPC_RMID, 0);标记删除段,这意味着它是使用shmget(..., IPC_CREAT)创建共享内存段的反操作。如果删除时引用计数器为0,则将立即删除该段。否则,删除将推迟到最后一个进程取消它(显式地使用shmdt()或通过终止隐式)。
发布于 2016-01-27 12:04:36
要解除进程地址空间中的共享内存映射,请使用系统调用shmdt(shared memory start virtual address),但要删除共享内存段,请使用shmctl()和IPC_RMID或ipcs命令。
共享内存段数据结构是在Linux内核内部维护的,因此删除共享内存段意味着从内核中删除或释放数据结构。
https://stackoverflow.com/questions/34992888
复制相似问题