sysv共享内存,会自动销毁吗?

时间:2012-07-16 16:34:34

标签: c system shared-memory sysv

如果不这样做,在Unix中分配的共享内存会自动销毁吗?

例如,一个进程创建了该段,另一个进程使用了​​该段。现在他们因某种原因都崩溃了,那个段是否导致内存泄漏?

3 个答案:

答案 0 :(得分:4)

一般不会。

如果你正在使用SysV共享内存(例如,shm_open),那么没有。所有SysV IPC原语都不能自我清理;你必须明确地清理它们,或者用ipcrm手动清理它们。这是我强烈反对使用它们的几个原因之一。

如果您mmap ping一个文件以获取共享内存,那么该文件显然不会自行消失。与任何其他文件一样,您必须明确unlink它才能让它消失。如果你已经这样做了,那么你就已经完成了。

答案 1 :(得分:1)

这取决于您为细分受众群提供的持久性。根据经验,如果你通过shm_open(或一个键)给它起一个名字,它将是持久的。因为这表明它会在您关闭创建它的进程后继续存在,除非您以某种方式“删除”它,否则执行shm_unlink。这是您可以在完全不同的流程之间共享细分的唯一方法。

所以,如果你这样做,你真的必须小心清理。这种持久段的最佳策略是让所有进程最初打开一个文件描述符,然后在每个人连接后立即取消链接。该段将一直存在,直到关闭它的最后一个文件描述符。

可以使用mmap直接匿名映射非持久性细分。当你的过程不复存在时,它们就会消失。

答案 2 :(得分:0)

没有。应明确丢弃已分配的共享内存段。

有用的命令行工具,用于列出碎片内存段并删除: ipcsipcrm。 最后一个可以用于前。当所有使用它的程序崩溃时删除一个段。