检查进程ID时使用WaitForSingleObject的好处

时间:2012-10-15 16:35:45

标签: c++ winapi pid

在这里使用WaitForSingleObject而不是使用它有什么好处?第一个代码块来自previous answer。第二个块就是我这样做的。

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

VS

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

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

WaitForSingleObject将一直等到进程完成/退出。只有这样它才会回归。