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
就像 open
。 shmdt
就像 close
而 [上面] shmctl
就像 unlink
.
如果您关闭一个文件,您希望它一直存在直到被特别删除,不是吗?所以,共享内存段的操作类似
我正在使用 ftok/shmget/shmat/shmdt 函数在 Linux 上创建、写入和读取共享段。
如果我在一个程序中写入该段然后退出,随后从另一个程序中读取该段,我惊讶地发现数据仍然存在。
我原以为当共享一个段的最后一个进程执行 shmdt 时,该段将被释放。
我可以依赖这种行为吗?还是类似于在 free() 之后继续使用指针?
shmdt
只会分离你的内存,不会对数据段执行 erase/overwrite。在其他一些流程映射并再次使用它之前,数据将持续存在。
此外,您应该使用更新的 POSIX 兼容 mmap
。
共享内存区域一直保留到通过shmctl(shmid,IPC_RMID,...)
[或系统重启]将其删除。这将在每个进程完成 shmdt
[或终止] 后生效。
语义与文件非常相似。 shmat
就像 open
。 shmdt
就像 close
而 [上面] shmctl
就像 unlink
.
如果您关闭一个文件,您希望它一直存在直到被特别删除,不是吗?所以,共享内存段的操作类似