【问题标题】:Benefit of Using WaitForSingleObject When Checking Process ID检查进程 ID 时使用 WaitForSingleObject 的好处
【发布时间】:2012-10-05 16:29:51
【问题描述】:

在这里使用WaitForSingleObject 与不使用相比有什么好处?第一个代码块来自previous answer。第二块是我的做法。

BOOL IsProcessRunning(DWORD pid)
{
    HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid);
    DWORD ret = WaitForSingleObject(process, 0);
    CloseHandle(process);
    return (ret == WAIT_TIMEOUT);
}

BOOL IsProcessRunning(DWORD pid)
{
   HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
   const bool exists = (process != NULL);
   CloseHandle(process);
   return exists;
}

似乎使用SYNCHRONIZE 需要更高的权限,我只想检查当前用户的PID。

【问题讨论】:

  • 为您添加一些比较工作 - 您可能需要比较 GetExitCodeProcessWaitForSingleObject 以确定流程完成状态。

标签: c++ winapi pid


【解决方案1】:

当一个进程完成时,它会停止运行,但它不会消失,直到它的最后一个句柄关闭。第一个解决方案区分这两种状态(仍在运行或已完成运行)。当然,当它返回时,答案可能已经过时了。

如果您不需要这种区别,那么您的方法很好(尽管我会将该函数命名为 DoesProcessExist 之类的名称)。

【讨论】:

  • 我还要添加进程 ID,理论上 可以重复使用。因此,每次通过其 ID 打开进程通常不是一个好主意。最好打开它的句柄一次(或者如果你创建了它,或者从某个第三方获得,则保存它)。
【解决方案2】:

IsProcessRunning 的实现也可以使用 GetExitCodeProcess Win32 API。

【讨论】:

  • 如果进程故意返回 259 (STILL_ACTIVE) 作为其退出代码怎么办?
【解决方案3】:

WaitForSingleObject 将等待进程完成/退出。只有这样它才会回来。

【讨论】:

  • 零超时是独创性的一部分(希望我拼写正确),它会立即超时(= 进程运行)或失败(= 僵尸进程)。
猜你喜欢
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多