我使用ftok / shmget / shmat / shmdt函数在Linux上创建,写入和读取共享段。
如果我在一个程序中写入段然后退出,随后从另一个程序中读取该段,我很惊讶地发现数据仍在那里。
我原本预计,当共享一个片段的最后一个进程执行shmdt时,该片段将被释放。
我可以依赖这种行为吗?或者它类似于在free()之后继续使用指针?
答案 0 :(得分:4)
共享内存区域保持不变,直到通过shmctl(shmid,IPC_RMID,...)
[或系统重新引导]删除它。这将在每个流程完成shmdt
[或终止]后生效。
语义与文件非常相似。 shmat
与open
类似。 shmdt
与close
类似,[上方] shmctl
与unlink
类似。
如果你关闭了一个文件,你希望它能一直保留到专门删除,不是吗?因此,共享内存段的运行方式相似
答案 1 :(得分:0)
shmdt
仅分离内存,不对数据段执行擦除/覆盖。在其他流程映射并再次使用之前,数据将持续存在。
此外,您应该使用更新的POSIX兼容mmap
。