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

时间:2011-09-22 06:28:40

标签: c++ winapi process process-management task-management

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

task_man.exe 40

将启动该过程的40个实例

task.exe

现在,每当task.exe退出(正确与否),我都必须开始新的替换它。

我粗略的想法是:

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

我可以使用更好的设计,还是更好的工作流程?这样做有标准的方法吗?我不想重新发明轮子......另外,我应该研究哪些API?

我也在寻找一种易于改变的设计 - 即如果我运行

task_man.exe 30

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

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

2 个答案:

答案 0 :(得分:2)

判断进程是否已退出的最简单方法是等待其处理。您可以通过以下几种方式实现这一目标:

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

答案 1 :(得分:1)

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