Linux共享内存的生命周期是什么?

5
我使用ftok/shmget/shmat/shmdt函数在Linux上创建、写入和读取共享段。如果我在一个程序中写入数据到该段,然后退出该程序,随后在另一个程序中读取该段时,我会惊讶地发现数据仍然存在。
我本来期望当最后一个共享该段的进程执行shmdt时,该段将被释放。我能否依赖这种行为?还是类似于在free()之后继续使用指针的情况?

释放段和替换数据是两回事。释放并不一定意味着旧数据已被替换。除非该段被其他进程覆盖,否则它将保留最初的数据,但对其他程序而言,它是垃圾。 - usamazf
分离(shmdt)不会销毁共享内存段。要这样做,您需要执行一个shmctl(),指定IPC_RMID为“cmd”。但请注意man页面(在Linux上)指出,直到所有进程都从中分离(shmdt),共享内存段ID才会被销毁。 - TonyB
2个回答

4
共享内存区域会一直保留,直到通过shmctl(shmid, IPC_RMID,...)[或系统重启]进行删除。这将在每个进程执行了shmdt[或终止]后生效。
语义与文件非常相似。shmat类似于openshmdt类似于close,而上述的shmctl则像unlink
如果关闭文件,希望它一直存在直到被明确删除,是吧?因此,共享内存段的操作类似。

0

shmdt 只是分离内存,不会在数据段上执行擦除/覆盖操作。直到其他进程再次映射和使用它,数据才会保留。

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


1
共享内存段至少具有内核生命周期,在一般情况下,它们会在重新启动时消失。这意味着您必须显式地删除它们(使用semctl的IPC_RMID操作)。您可以将它们视为“临时文件”。 - Jean-Baptiste Yunès

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接