0

我正在寻找使用 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,或者对我提出的整体设计的建议。

4

2 回答 2

2

判断进程是否退出的最简单方法是等待它的句柄。您可以通过以下几种方式做到这一点:

  1. 构建一个包含所有进程句柄的数组,并使用WaitForMultipleObjects(bWaitAll 为 FALSE)等待所有进程句柄。然后,当您的代码继续运行时,您必须确定哪个进程结束,创建一个新进程,更新数组并再次等待。
  2. 运行 40 个线程,每个线程创建一个进程并无限等待其一个句柄(使用 WaitForSingleObject)。然后,当该任务结束时,该线程将负责创建一个新任务并等待它。
  3. 如果您不想创建 40 个线程,只需让一个线程在每个进程句柄上等待一小段时间(使用 WFSO),然后检查返回值。您的程序会以这种方式响应较慢,但更容易识别已结束的进程,并且您不会创建很多线程。
于 2011-09-22T06:41:37.653 回答
1

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

于 2011-09-22T06:38:07.710 回答