首页 > 解决方案 > 进程未调用 shm_unlink 的后果

问题描述

我的程序有 2 个进程,一个主进程和一个从属进程。主设备通过共享内存缓冲区与从设备通信。主服务器创建共享内存

shm_open("shared_buff", O_CREAT | O_RDWR, 0666);

从站使用相同的 shm_open 行将其指针放入缓冲区。主服务器可能会在从服务器有机会正常关闭并在共享内存缓冲区上调用 shm_unlink() 之前杀死它。我想知道这是否会导致内存泄漏,如果是这样,我能做些什么吗?

我目前面临一个错误,在主人杀死奴隶并尝试重新启动它之后,奴隶不再有权访问缓冲区。我不是 100% 确定这是否是问题的原因,但似乎很可能。需要明确的是,第一次运行一切正常,只有在第二次启动奴隶时才会出现问题。据我所知,没有打印任何错误或堆栈跟踪。

另一种解决方案是新链接的共享内存对象(在从属端)将简单地替换旧分配。这样的事情可能吗?

标签: ipcshared-memory

解决方案


如果主进程和从进程都使用打开共享内存O_CREAT并且其中一个进程成功调用shm_unlink,那么下一次调用shm_open将创建一个新的共享内存对象,与第一个不同(shm_unlink手册页描述中的一个小条款) . 我怀疑这是你第二次看到的。

我建议主进程单独负责使用O_CREATO_EXCL(并设置文件大小等)创建共享内存对象。然后,从属进程应该使用 O_RDWR(或任何适当的方法)打开共享内存,然后用于close删除文件描述符(以受控方式或在从属进程被杀死时由内核)。sm_unlink 所做的只是从共享内存对象名称的命名空间中删除共享内存对象的名称(就像unlink简单地从目录中删除文件名一样),这应该由主服务器完成,作为其优雅的一部分(确保捕获信号适当)关机。


推荐阅读