在我的项目中,我使用共享内存将数据从一个进程传输到另一个进程。数据将是巨大的,因为那些是图像。在多次运行该过程后,我可以看到 shmat 失败。经过深入调查后,我发现在每个循环过程中都会有一些内存泄漏。我只是想知道它是否可能是失败的原因? IPC共享内存是否从堆中获取内存?或者可能是同样的失败的另一个原因是这个过程的循环运行正常。
答案 0 :(得分:2)
鉴于你的场景(一个多次运行的进程,并且在十分之后失败),我怀疑它与堆内存泄漏无关(在进程退出后这将是无关紧要的)。
听起来你达到了与共享内存相关的系统限制。最可能的限制是1)对共享内存段总数的限制,或2)对共享内存总量的限制。如果您在每次进程运行时创建一个段,并且无法使用shmctl()将其标记为销毁,则可能会出现此问题。
默认情况下,当进程退出时,它将自动从任何连接的共享内存中分离出来;但是,您必须明确销毁该段,以便在所有进程分离后回收资源。
始终检查系统调用中的返回代码/错误指示符,并检查联机帮助页以了解原因和可能的解决方法。