使用共享内存以及如何使用IPC_RMID正确地取消分配空间

时间:2017-02-27 05:50:27

标签: c linux shared-memory openwrt

我的Linux机器,服务器和客户端上运行了2个应用程序。我正在使用的服务器和客户端示例来自 Dave Marshalls examples

一切都运行良好,但是当我在后台进程中尝试这个并且我想扩展我的原始段(可能是由于将来的应用程序升级)我要么必须更改我的密钥或以某种方式通过{{1}在我的应用程序中调用。因为我的应用程序不能优雅地退出,并且在分配后我无法在开头设置此权限(因为一旦标记为删除,没有其他应用程序将能够使用此共享内存空间)我无法清除此空间。 / p>

到目前为止,我提出的最好的方法是shmctl(shmid, IPC_RMID, 0)我的旧部分,检查它是否存在,如果确实存在,则清除它然后将其分配给高值。这看起来像是:

shmget

其他SO问题要么似乎没有触及,要么将其作为一个可能的问题提出来。有没有更好的方法来做到这一点,我错过了或者我可以简单地将它重新分配给更高的价值而不是清除它?

1 个答案:

答案 0 :(得分:1)

您没有说明您正在运行哪种操作系统。如果您使用的是LinuxOpenBSD 5.1 or laterother operating systems configured a particular way,只要仍然附加某些信息,您就可以在完成IPC_RMID之后附加信息但请记住这种行为不可移植(这里是较旧的examination of IPC_RMID behaviour on different OSes)。如果没有这种行为,如果你的程序崩溃(也就是说“不会优雅地退出”),当它是最后一个附加到该段的东西时,很难避免过时的段被遗忘。

我还应该注意到你的问题听起来类似于Options for robust process cleanup在UNIX Socket FAQ论坛上讨论的问题,其中的建议包括:使用Linux的IPC_RMID行为,监控父进程检查处理死亡并进行清理。