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

Posted

技术标签:

【中文标题】Linux上共享内存的生命周期是多少【英文标题】:What is the lifetime of shared memory on Linux 【发布时间】:2016-02-27 06:25:52 【问题描述】:

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

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

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

我可以依赖这种行为吗?还是类似于 free()'ing 后继续使用指针?

【问题讨论】:

释放段和替换数据是两件不同的事情。释放并不一定意味着旧数据已被替换。在该段被其他进程覆盖之前,它将拥有最初拥有的数据,但对于其他程序来说,它是垃圾。 分离 (shmdt) 不会破坏共享内存段。为此,您需要执行 shmctl() 将 IPC_RMID 指定为“cmd”。但请注意手册页(在 Linux 上)表明共享内存段 ID 不会被销毁,直到所有进程都从它分离(shmdt)。 【参考方案1】:

共享内存区域一直存在,直到通过shmctl(shmid,IPC_RMID,...) [或系统重新启动] 将其删除。这将在每个进程完成shmdt [或终止]后生效。

语义与文件非常相似。 shmat 就像 openshmdt 就像 close 和 [上方] shmctl 就像 unlink

如果您关闭一个文件,您希望它一直存在,直到被明确删除,不是吗?因此,共享内存段的操作类似

【讨论】:

【参考方案2】:

shmdt 只会分离你的内存,不会对数据段执行擦除/覆盖。直到其他一些流程图并再次使用它,数据才会持续存在。

此外,您应该使用更新的、符合 POSIX 的mmap

【讨论】:

共享内存段至少有内核生命周期,通常它们在重新启动时消失。这意味着您必须明确删除它们(semctl 的 IPC_RMID 操作)。您可以将它们视为临时文件

以上是关于Linux上共享内存的生命周期是多少的主要内容,如果未能解决你的问题,请参考以下文章

java 静态变量生命周期(类生命周期)(转)

DLL 编译后的生命周期是多少?

java 静态变量生命周期(类生命周期)

共享指针生命周期

Vue组件的生命周期 & 数据共享

六组件的生命周期与组件间之间的数据共享