4

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

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

4

3 回答 3

4

一般不会。

如果您使用的是 SysV 共享内存(例如shm_open),则不需要。SysV IPC 原语都不会自行清理;您总是必须明确地清理它们,或者使用ipcrm. 这是我强烈建议不要使用它们的几个原因之一。

如果您要mmapping 一个文件以获取共享内存,那么该文件显然不会自行消失。像任何其他文件一样,你必须明确地unlink让它消失。如果你已经这样做了,那么你就准备好了。

于 2012-07-16T16:42:39.740 回答
1

这取决于您给予该细分市场的持久性。根据经验,如果您通过shm_open(或键)给它一个名称,它将是持久的。这表明它会在您关闭创建它的进程后持续存在,除非您以某种方式“删除”它,即执行shm_unlink. 这是您可以在完全不同的进程之间共享段的唯一方法。

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

非持久段可以直接使用匿名映射mmap。随着您的流程不复存在,它们将消失。

于 2012-07-16T21:58:23.000 回答
0

不可以。分配的共享内存段应该被明确地丢弃。

用于列出粉碎内存段和删除的有用命令行工具: ipcsipcrm. 最后一个可以用于ex。当所有使用它的程序都崩溃时删除一个段。

于 2012-07-16T16:40:18.410 回答