进程未调用shm_unlink的后果

时间:2018-11-27 19:20:40

标签: ipc shared-memory

我的程序有2个进程,一个主进程和一个从属进程。主机通过共享内存缓冲区与从机通信。主机使用以下方式创建共享内存

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

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

我当前遇到一个错误,在该错误中,当主节点杀死了从节点并尝试重新启动它后,从节点不再能够访问缓冲区。我不是100%知道这是否是问题的起因,但​​似乎很可能。为了清楚起见,在第一次通过时一切运行良好,只有在第二次启动从属服务器时才会出现问题。据我所知,不会打印任何错误或堆栈跟踪。

另一种解决方案是针对新链接的共享mem对象(在从属端)仅替换旧分配。这样可能吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

SysV共享内存是系统范围的全局资源。如果您在使用完毕后不释放它,最终将用完。