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

What is the lifetime of shared memory on Linux

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

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

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

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

shmdt 只会分离你的内存,不会对数据段执行 erase/overwrite。在其他一些流程映射并再次使用它之前,数据将持续存在。

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

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

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

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