multithreading - 看门狗获胜服务,观看另一获胜服务

标签 multithreading windows-services communication interop

我想制作一个Windows服务来监视另一个Windows服务,并确保它正在运行。
有时,我要监视的Win Service保留在内存中(出现在任务管理器中,因此它被视为正在运行的服务,但事实是它什么也不做,它已经死了,其计时器由于某种原因未触发,这不是此问题的主题)。

我需要做一个看门狗Win Service,它以某种方式读取其他被监视服务正在定期写入的内存中的值。
我曾考虑过使用命名管道,但我不想在服务中添加通信问题,我想知道是否有办法在2个应用程序之间创建这样的共享内存(可能使用命名系统范围的Mutex?)。

最佳答案

由于您必须处理检测僵尸服务,因此我认为使用互斥体之类的内核对象不会有所帮助,因此您需要检测 Activity 。信号量也不适合。

我个人的喜好是发送小的心跳消息的命名管道(因为也可以通过网络检测到),但是如果您想避免管道通信的复杂性(我想这是可以理解的),则可以在其中更新DWORD预定的注册表项。如果两个服务都在LocalSystem下运行,则可以将键/值写入HKEY_LOCAL_MACHINE。运行启动计时器,并时常监视键的更改(注意计数器是否环绕)。您将没有普通的窗口/消息泵,因此SetTimer超出了限制,但是您仍然可以使用timeSetEvent或等待计时器。

如果其中一项服务在非管理员帐户下运行,则HKLM将不可用,但是对于服务而言,这是非常罕见的情况。当然,所有这些都假定您可以访问这两种服务的代码。观看第三方服务会严重限制您的选择。

关于multithreading - 看门狗获胜服务,观看另一获胜服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1980030/

相关文章:

Java:如何通过线程同步文件修改

c++ - 如何制作一个永远运行的线程?

java - 暂停和恢复井字游戏获胜动画

iOS Container View 和 Parent ViewController 通信?

java - 通知所有()不起作用

powershell - 设置服务: Cannot stop service because it is dependent on other services

c# - WIX-Installer ServiceControl "sufficient privileges"错误

java - 将java作为windows服务运行的简单灵活的方法

android - Android 与 PC 通信

c++ - 如何处理 Perl TCP 套接字中的消息碎片?