【问题标题】:determine if a process is dead or not - by PID确定进程是否死亡 - 通过 PID
【发布时间】:2009-11-30 21:35:07
【问题描述】:

我有两种不同的方法来检查进程是否仍在运行:

1) 使用 GetExitCodeProcess() 2) 使用 CreateToolhelp32Snapshot() 遍历进程列表并检查 PIDs

现在,在这两种情况下,我仍然知道我用 TerminateProcess 终止的进程仍然存在,即使它不是。

有没有办法通过 PID 确定一个进程是活着还是死了? 谢谢!

【问题讨论】:

  • 你用 TerminateProcess 杀死了一个进程,它肯定已经死了,但它在进程列表中?你的第三段是一个悖论。
  • 好吧,我在进程资源管理器上看不到它,但 GetExitCodeProcess() 和遍历进程都返回该 PID 仍然存在。

标签: c windows process


【解决方案1】:

不要将 PID 用于这样的事情。 PID 被重复使用,并且具有 very 窄范围,具有 very 高碰撞概率。换句话说,您会发现一个正在运行的进程,但将是一个不同的进程。

【讨论】:

  • 没有精灵尘埃。更好地描述您的要求,为什么要终止进程以及为什么要关心它们是否仍在运行?大多数情况下,解决方案涉及一些 IPC 共享资源,例如信号量,这需要进程的合作(能够让您的代码在进程中执行)。对于外国进程,真的没有任何解决方案。
  • 使用 Windows 进程可共享的内核对象——例如,命名管道(Windows 命名管道不是 Unix)。如果重复使用 PID,您可以确定它不会打开同名的命名管道,除非它是相同类型的进程。但是,我感觉您不会采用这种级别的同步粒度。
  • 顺便说一句,TerminateProcess 是否返回成功?
  • 考虑到您已确认不是 另一个 进程劫持了 PID,这些应用程序有什么特别之处吗?他们是否有任何机会附加调试器?
  • 不,没有调试器。显然进程表的更新存在滞后。我不喜欢窗户。
【解决方案2】:

GetExitCodeProcess 的调用应该为活动进程返回STILL_ACTIVE。调用TerminateProcess后,进程会死掉,返回一个不同的值。

检查进程是否处于活动状态的另一种方法是WaitForSingleObject。如果您在超时为 0 的进程句柄上调用它,如果进程仍在运行,它将立即返回 WAIT_TIMEOUT

【讨论】:

  • 好吧,事实并非如此。调用 TerminateProcess() 后,我检查 GetExitCodeProcess 并返回 STILL_ACTIVE。我认为进程表没有更新或更新需要时间
  • TerminateProcess 可以将 STILL_ACTIVE (259) 指定为错误代码;这将使一个死进程看起来像一个活进程。您可以使用WaitForSingleObject 仔细检查(编辑答案)
  • 感谢您的提示。我添加了代码,它返回 WAIT_TIMEOUT (258),所以进程正在运行。即使在杀戮之后
  • 我无法理解其背后的逻辑。呼叫将立即返回。进程死亡时的返回状态是什么? (不是 WAIT_TIMEOUT)
  • 进程死亡时,WaitForSingleObject返回WAIT_OBJECT_0,表示等待成功。这意味着进程句柄已发出信号(完成)。
【解决方案3】:

您不能假设一个低级 API 调用的功能与它看起来的方式或您认为它应该如何从它的名称或高级描述中运行一样。内核仍然有事情要做,并且调用通常只是对内核的请求,并且内核在实际释放 PID 之前需要做很多事情(取决于实现)。在这种情况下,在您发出调用后,您可能会认为进程已死,但内核仍需要清理。

From MSDN :

使用 TerminateProcess 函数 无条件地使进程 出口。全局数据状态 由动态链接库维护 (DLL)可能会受到损害,如果 使用 TerminateProcess 而不是 退出进程。

TerminateProcess 启动终止 并立即返回。这停止 内所有线程的执行 处理并请求取消 所有待处理的 I/O。终止的 进程无法退出,直到所有待处理 I/O 已完成或取消。

进程不能阻止自己 被终止。

【讨论】:

    【解决方案4】:

    您可以使用Process Status API 吗? enumerating 系统上所有正在运行的进程都有函数 - 这可以帮助你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2020-03-02
      • 2014-11-24
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多