什么是测试给定id的任何进程目前是否在Linux上运行的简单方法?

时间:2010-07-05 18:03:44

标签: c++ linux

在C ++中,我有一个绑定到pid的资源。有时,与该pid相关联的进程异常退出并泄漏资源。

因此,我正在考虑将pid放在记录资源正在使用的文件中。然后当我去获取资源时,如果我看到一个项目已注册为正在使用,我会搜索是否正在运行与pid匹配的进程,如果没有,则清理泄漏的资源。

我意识到一个新的未分离的pid现在共享相同数字的可能性非常小,但这比我现在没有清理的泄漏要好。

或者,也许有一个更好的解决方案,如果是这样,请建议,否则,我会追求pid录音。

更多详细信息:资源是通过tcp在客户端和服务器之间进行通信的端口号。只有一个客户端实例可以在计算机上使用给定的端口号。端口号取自一系列可用的端口号。在客户端运行时,它会记录它在磁盘上的特殊文件中使用的端口号,然后在退出时清除此条目。对于异常退出,当它不再被使用时,并不总是清理它并且端口号被注释为正在使用中。

5 个答案:

答案 0 :(得分:4)

要检查是否存在具有给定ID的进程,请使用kill(pid,0)(我假设您在POSIX系统上)。有关详细信息,请参阅man 2 kill

此外,您可以使用waitpid调用在流程完成时收到通知。

答案 1 :(得分:3)

我建议您使用某种OS资源,而不是PID。互斥锁,信号量,删除关闭文件。当进程退出时,所有这些都由操作系统清理。

在Windows上,我建议使用一个名为mutex。

在Linux上,我建议在文件上使用flock。

答案 2 :(得分:2)

启动进程的主进程(异常终止的进程)如何等待进程崩溃(waitpid)并在waitpid返回时再次生成进程。

while(1) {
fork exec
waitpid
}

答案 3 :(得分:0)

问题域名不清楚,不幸的是,您可以尝试以其他方式重新解释它。

但如果我理解正确,你可以创建一个像

这样的地图
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 call完成),并从map中删除每个包含不当ID的条目。执行此操作后,您将只剩下有效的流程资源对。根据您的需要,此操作可以每YY秒重复一次。

请注意,在这种情况下,从地图中删除项目基本上会调用相应的析构函数(因为,如果您的资源未在其他地方的代码中使用,则其引用计数将降至零)。

答案 4 :(得分:0)

在Windows上实现该功能的API是OpenProcess,它将进程ID作为输入,而GetExitCodeProcess在进程仍然处于活动状态时返回STILL_ACTIVE。你也可以使用任何没有超时的Wait函数,但这个API似乎更清晰。

然而,正如其他答案所指出的那样,这似乎并不是一条充满希望的道路。如果您提供更多方案详细信息,我们可能会提供更有针对性的建议。你的平台是什么?什么是泄露的资源?您是否可以访问泄露的应用代码?你可以将它包装在一个高级的try-catch中并进行一些清理吗?如果没有,也许等待泄漏者完成一个专用线程(或完全专用的进程)?您提供的任何细节都可能有所帮助。