【问题标题】:How to avoid shared memory leaks如何避免共享内存泄漏
【发布时间】:2014-03-27 15:05:52
【问题描述】:

我在 Suse Linux 上的 2 个进程之间使用共享内存,我想知道如何避免共享内存泄漏,以防一个进程崩溃或两者兼而有之。在这种情况下是否会发生泄漏?如果是,我该如何避免?

【问题讨论】:

  • 改用共享的mmap()文件映射?
  • 因为当一个进程死亡时,它的所有映射内存区域也会消失,这与可能成为孤立的共享内存段不同。当然,在这种情况下,如果进程意外终止,文件仍然存在,但它不再映射到内存中消耗内存资源...

标签: linux shared-memory


【解决方案1】:

您可以为共享内存区域中的两个计数器分配空间:每个进程一个。每隔几秒钟,每个进程都会增加它的计数器,并检查另一个计数器是否也增加了。如果有人崩溃或退出,这使得这两个进程或外部看门狗可以轻松拆除共享内存。

【讨论】:

    【解决方案2】:
    • 如果子进程是来自父进程的简单fork(),那么mmap()MAP_SHARED 应该可以工作。

    • 如果子进程执行exec() 来启动不同的可执行文件,您通常可以从shm_open() 或类似的不可移植系统调用(参见Is there anything like shm_open() without filename?)传递文件描述符。 Linux,您可以 shm_unlink() 来自 shm_open() 的文件描述符,这样当您的进程死亡时它不会泄漏内存,并使用 fcntl() 清除 shm 文件描述符上的 close-on-exec 标志,以便您的子进程可以跨exec继承它。这在 POSIX 标准中没有得到很好的定义,但在实践中它似乎非常便携。

    • 如果您需要使用文件名而不是文件描述符编号来将共享内存对象传递给不相关的进程,那么您必须自己想办法在文件不再存在时自行处理需要;请参阅 John Zwinck 对一种方法的回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2018-04-08
      • 2013-06-24
      • 1970-01-01
      • 2016-08-14
      相关资源
      最近更新 更多