在C ++中,我有一个绑定到一个pid的资源。 有时,与该pid关联的进程exception退出并泄漏该资源。
因此,我正在考虑将pid放入logging资源的文件中。 然后,当我去获取资源时,如果我看到一个项目被注册为正在使用,我将search以查看是否与pid匹配的进程当前正在运行,如果没有,清理泄漏的资源。
我意识到有一个非常小的可能性,一个新的未分析的pid现在共享相同的数字,但是这比现在没有清理的漏洞要好。
或者,也许有更好的解决办法,如果是的话,请build议,否则,我会追查录像。
更多细节:资源是用于通过tcp在客户端和服务器之间进行通信的端口号。 客户端只有一个实例可以使用机器上给定的端口号。 端口号取自一系列可用的端口号。 当客户端正在运行时,会logging它在磁盘上的特殊文件中使用的端口号,然后在退出时清除该条目。 对于exception退出,这不总是得到清理,端口号被注释为正在使用,当它不再被使用。
要检查给定ID的进程的存在,使用kill(pid,0)
(我假设你在POSIX系统上)。 详情请参阅man 2 kill
。
另外,您可以使用waitpid
调用在进程结束时收到通知。
我建议你使用某种操作系统资源,而不是PID。 互斥体,信号量,关闭时删除文件。 当一个进程退出时,所有这些都由操作系统清理。
在Windows上,我会推荐一个命名互斥体。
在Linux上,我会建议在一个文件上使用flock。
如果启动进程的主进程(异常终止的进程)等待进程崩溃(waitpid),并在waitpid返回时再次产生。
while(1) { fork exec waitpid }
问题域不清楚,不幸的是,你可以尝试以其他方式重新解释它。
但如果我正确理解你,你可以创建一个像
std::map< ProcessId, boost::shared_ptr<Resource> > map; // `Resource` here references to some abstract resource type // and `ProcessId` on Windows system would be basically a DWORD
在这种情况下,您只需列出每个正在运行的进程(这可以通过Windows上的EnumProcesses调用来完成),并从map
删除每个具有不正确标识的条目。 这样做之后,您将只剩下有效的进程 – 资源对。 这个动作可以每YY
秒重复一次,这取决于你的需求。
请注意,在这种情况下,从地图中删除一个项目,基本上会调用相应的析构函数(因为如果你的代码没有在你的代码中被使用,它的引用计数就会降到零)。
在Windows上实现的API是OpenProcess ,它将进程ID作为输入, GetExitCodeProcess在进程仍然活动时返回STILL_ACTIVE。 您也可以使用任何等待零功能的超时功能,但是这个API似乎更清晰。
然而,正如其他答案所指出的那样,这似乎并不是一条有希望的道路。 如果您提供更多的场景细节,我们可能会提供更有针对性的建议。 你的平台是什么? 什么是泄漏资源? 您是否有权访问泄露的应用程序代码? 你可以用一些清理包装它在一个高层次的尝试抓住? 如果没有,也许等到专家的线程完成(或完全专用的进程)呢? 你提供的任何细节可能会有帮助