从 EXE COM 服务器检测客户端进程终止

Posted

技术标签:

【中文标题】从 EXE COM 服务器检测客户端进程终止【英文标题】:detect client process termination from EXE COM Server 【发布时间】:2009-06-26 15:10:42 【问题描述】:

我正在编写一个 EXE COM 服务器,它公开了一个锁定系统资源的类。 在正常执行中,客户端释放资源(COM 可执行文件在几秒钟后关闭。 在异常执行中,客户端应用程序崩溃,留下一个具有正引用计数的实例。 COM 可执行文件运行约 12 分钟直到终止。这意味着在此期间系统资源被锁定。

有没有办法立即检测客户端终止,例如在套接字 IPC 或驱动程序协议中?如果不是,那么 COM 似乎不如其他 IPC 机制。

【问题讨论】:

【参考方案1】:

几年前我也有同样的问题。我在这里找到了答案:How To Turn Off the COM Garbage Collection Mechanism。简而言之:不,没有办法立即检测到客户端终止。摘录:

当 COM 客户端正常终止时, 它释放对其的所有引用 服务器对象。当一个客户 然而异常终止,有 可能是对 服务器对象。没有垃圾 收集机制,服务器代码 无法知道何时收回 分配给 COM 的资源 对象,这可能会导致 资源泄漏。为了解决这个问题 问题,COM 实现了一个自动 垃圾回收机制,其中 COM 解析器进程 (RPCSS) 客户端机器 ping 服务器 机器代客户 过程。

使用 COM 的 GC 的替代方案 协议(例如,使用周期性 应用程序级“pings”——方法 通知对象的调用 客户还活着,或使用 底层传输机制,例如 TCP keepalives)明显很多 效率较低。因此,DCOM 的 应该使用默认的 GC 机制 对于任何必须关闭的对象 当他们的客户消失或 否则如果这些对象行为不端 将有效地成为内存泄漏 在服务器上。

服务器机器上的解析器 跟踪每个人的 ping 服务器对象。 ping周期为2 分钟,目前,它是非 可配置。当解析器在 服务器机器检测到一个对象 6 分钟没有被 ping 通,它 假定对象的所有客户端 已终止或以其他方式不 使用对象的时间更长。解析器 然后将释放所有外部 对象的引用。它这样做 通过简单地拥有对象的存根 管理器(COM 运行时代码 向每个对象传递调用)调用 ::Release() 在对象的 IUnknown 上 界面。此时,对象的 参考计数将为零 与 COM 运行时有关。 (那里 可能仍然是本地持有的参考资料 (同一个公寓)客户,所以 对象的内部引用计数可能 此时不一定会归零 点。)然后对象可能会关闭 自己下来了。

注意:垃圾收集适用于 所有服务器,无论是否 他们的客户是本地或远程的,或者 本地和远程的组合。这 底层 ping 机制是 在当地情况下与否不同 生成网络数据包,但对于 所有实际目的,行为 是一样的。

【讨论】:

以上是关于从 EXE COM 服务器检测客户端进程终止的主要内容,如果未能解决你的问题,请参考以下文章

终止从套接字服务器派生的僵尸子进程

如何查找任务管理器里的进程位置?

由于未处理的异常,该进程被终止 - WCF 服务

我可以检测 Android 是不是从 Notification Intent / PendingIntent 中终止了应用程序(任务进程)吗?

COM客户端连接COM服务器所需的文件是什么(进程外方案)?

centosc程序异常终止