ipc - 进程未调用 shm_unlink 的后果
问题描述
我的程序有 2 个进程,一个主进程和一个从属进程。主设备通过共享内存缓冲区与从设备通信。主服务器创建共享内存
shm_open("shared_buff", O_CREAT | O_RDWR, 0666);
从站使用相同的 shm_open 行将其指针放入缓冲区。主服务器可能会在从服务器有机会正常关闭并在共享内存缓冲区上调用 shm_unlink() 之前杀死它。我想知道这是否会导致内存泄漏,如果是这样,我能做些什么吗?
我目前面临一个错误,在主人杀死奴隶并尝试重新启动它之后,奴隶不再有权访问缓冲区。我不是 100% 确定这是否是问题的原因,但似乎很可能。需要明确的是,第一次运行一切正常,只有在第二次启动奴隶时才会出现问题。据我所知,没有打印任何错误或堆栈跟踪。
另一种解决方案是新链接的共享内存对象(在从属端)将简单地替换旧分配。这样的事情可能吗?
解决方案
如果主进程和从进程都使用打开共享内存O_CREAT
并且其中一个进程成功调用shm_unlink
,那么下一次调用shm_open
将创建一个新的共享内存对象,与第一个不同(shm_unlink
手册页描述中的一个小条款) . 我怀疑这是你第二次看到的。
我建议主进程单独负责使用O_CREAT
和O_EXCL
(并设置文件大小等)创建共享内存对象。然后,从属进程应该使用 O_RDWR(或任何适当的方法)打开共享内存,然后用于close
删除文件描述符(以受控方式或在从属进程被杀死时由内核)。sm_unlink 所做的只是从共享内存对象名称的命名空间中删除共享内存对象的名称(就像unlink
简单地从目录中删除文件名一样),这应该由主服务器完成,作为其优雅的一部分(确保捕获信号适当)关机。
推荐阅读
- react-native - 在 React Native 0.61 版本中安装项目
- amazon-web-services - S3 效率覆盖与读取
- mapping - 使用 ontop 将我的 oracle 数据库集成到我的 owl
- python - 如何在 Windows 中为 Tensorflow 设置 GPU (AMD Radeon R5 M330)
- random - sklearn - 来自 GaussianMixture 的样本,没有拟合
- javascript - 检测可能被物体隐藏的网格的可见性
- jenkins-plugins - Maven Surefire 插件 - 在输出报告中更新测试状态
- json - 无法从 Wikipedia API 遍历不正确分组的数据
- bash - 执行到特定目录中的 kubernetes pod
- zabbix - 如何获取“计算”字段项的 Zabbix 状态标志?