我希望使用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,或者我提出的总体设计建议。
判断进程是否退出的最简单方法是等待它的句柄。您可以通过以下几种方式实现:
- 构建一个包含所有进程句柄的数组,并使用WaitForMultipleObjects (bWaitAll为FALSE)来等待所有进程句柄。然后,当您的代码继续时,您必须找出哪个进程结束了,创建一个新进程,更新数组并再次等待。
- 运行40个线程,每个线程创建一个进程并无限等待它的一个句柄(使用WaitForSingleObject)。然后,当该任务结束时,该线程将负责创建一个新的并等待它。
- 如果您不想创建40个线程,只需创建一个线程,它将在每个进程句柄上等待很短的时间(使用WFSO),并检查返回值。这样,程序的响应速度会变慢,但是更容易识别已经结束的进程,并且不会创建很多线程。
如果您想用等待操作替换池,您可以对已创建的进程使用WaitForSignalObject/WaitForMultipleObjects。进程句柄在进程退出时发出信号。与池化不同,等待操作不消耗CPU。等待线程是不活动的,除非其中一个对象被通知。