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

标签 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,或者对我提出的整体设计的建议。

最佳答案

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

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

关于c++ - C++ 中的任务监视器和管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7510463/

相关文章:

c++ - 文本宽度后的复选框大小

windows - 当不知道 InterfaceClassGUID 时,我可以使用 SetupDiEnumDeviceInterfaces 从 SetupDiGetDeviceInterfaceDetail 获取 DevicePath 吗?

c# - 如何在 C# Windows 窗体中取回已打开窗口的焦点

c++ - 为什么进程会在 RtlExitUserProcess/LdrpDrainWorkQueue 中挂起?

c++ - 在 C++ 中使用 CImg 相乘和相加图像

c++ - visual studio 可以使用 gcc 生成的调试信息吗?

c++ - 不同类型的运算符

c# - 如何在 .NET 中生成进程并捕获其 STDOUT?

c - parent 不创造 child ?

c++ - 是否有常量的 C++ 临时右值