C++ 中的任务监视器和管理器

Task monitor and manager in C++

提问人:Luchian Grigore 提问时间:9/22/2011 最后编辑:Luchian Grigore 更新时间:9/22/2011 访问量:1873

问:

我希望使用 Win32 API 构建任务监视器/管理器。它将使用命令行参数启动(最好作为 Windows 服务),指定它应该启动新进程的实例数。

task_man.exe 40

将启动该进程的 40 个实例

task.exe

现在,每当任务.exe退出(正确与否)时,我都必须启动一个新任务来替换它。

我的粗略想法是这样的:

从 task_man 启动任务,获取其 PID,然后有一个循环来检查 PID 是否都是活动进程。对于每个无效的 PID,启动一个新进程,并用新 PID 替换旧 PID。

有没有更好的设计,或者更好的工作流程?有没有标准方法可以做到这一点?我不想重新发明轮子......另外,我应该研究哪些 API?

我也在寻找一种易于事后更改的设计——即如果我运行

task_man.exe 30

之后,新task_man不应开始运行,而应更改前一个实例中的任务数。(我知道它会开始运行,我说它应该修改原始版本然后退出)

我不是在寻找代码(因为我不是在寻找完整的实现,也不是说我介意查看示例),而是我可以使用哪些 API,或者对我提出的整体设计的建议。

C++ WinAPI 进程 任务管理

评论

0赞 HostileFork says dont trust SE 9/22/2011
你说你“不想要代码”,但当存在你可以仔细阅读的开源程序时,这只是懒惰。如果你对他们的范式有所了解,你甚至可能会意识到你所做的努力会更好地表达为对他人工作的扩展。阅读一些代码,查看它们使用的 API,然后阅读这些 API 的文档。也许是一个很好的起点:processhacker.sourceforge.net
0赞 HostileFork says dont trust SE 9/22/2011
如果它们使用您在相关平台上理解的语言,请不要害怕完整的实现。一个完整的实现往往有很多“真正的”担忧,而仅仅一个样本就会掩盖这些担忧。人们使用的工具多年开发的产物通常比 StackOverflow 上的路过式答案要深刻得多。潜入其中,环顾四周,构建别人的代码库并逐步完成它......这是一件好事。
0赞 HostileFork says dont trust SE 9/22/2011
我在这里对听起来相当宽泛的声明做出反应:“我希望使用 Win32 API 构建任务监视器/管理器。如果你的最终目的真的比这更狭窄,那么你可以考虑将标题和问题的介绍缩小到听起来更简单的东西。

答:

1赞 Alex F 9/22/2011 #1

如果要将池化替换为等待操作,则可以将 WaitForSignalObject/WaitForMultipleObjects 用于创建的进程。当进程退出时,进程句柄将发出信号。与池化不同,等待操作不消耗 CPU。等待线程处于非活动状态,除非其中一个对象发出信号。

2赞 Eran 9/22/2011 #2

判断进程是否已退出的最简单方法是等待其句柄。您可以通过以下几种方式执行此操作:

  1. 生成所有进程句柄的数组,并使用 WaitForMultipleObjects(bWaitAll 为 FALSE)等待所有进程句柄。然后,当你的代码继续时,你必须弄清楚哪个进程结束了,创建一个新进程,更新数组,然后再次等待。
  2. 运行 40 个线程,每个线程创建一个进程并无限等待其一个句柄(使用 WaitForSingleObject)。然后,当该任务结束时,该线程将负责创建一个新任务并等待它。
  3. 如果不想创建 40 个线程,只需让一个线程在每个进程句柄上等待短时间(使用 WFSO),然后检查返回值。这样程序的响应速度会变慢,但更容易识别已结束的进程,并且不会创建很多线程。