Linux上共享内存的生命周期是多少

时间:2016-02-27 06:25:52

标签: c++ c linux shared-memory

我使用ftok / shmget / shmat / shmdt函数在Linux上创建,写入和读取共享段。

如果我在一个程序中写入段然后退出,随后从另一个程序中读取该段,我很惊讶地发现数据仍在那里。

我原本预计,当共享一个片段的最后一个进程执行shmdt时,该片段将被释放。

我可以依赖这种行为吗?或者它类似于在free()之后继续使用指针?

2 个答案:

答案 0 :(得分:4)

共享内存区域保持不变,直到通过shmctl(shmid,IPC_RMID,...) [或系统重新引导]删除它。这将在每个流程完成shmdt [或终止]后生效。

语义与文件非常相似。 shmatopen类似。 shmdtclose类似,[上方] shmctlunlink类似。

如果你关闭了一个文件,你希望它能一直保留到专门删除,不是吗?因此,共享内存段的运行方式相似

答案 1 :(得分:0)

shmdt仅分离内存,不对数据段执行擦除/覆盖。在其他流程映射并再次使用之前,数据将持续存在。

此外,您应该使用更新的POSIX兼容mmap