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

6 c++ winapi pid

使用WaitForSingleObject此处而不是不使用它有什么好处?第一个代码块来自之前的答案.第二个块是我如何做到这一点.

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

VS

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

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

Adr*_*thy 9

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

如果你不需要这种区别,那么你的方法很好(虽然我会将函数命名为DoesProcessExist).

  • 我还要添加进程 ID *理论上*可以重复使用。因此,每次都通过进程 ID 打开进程通常不是一个好主意。最好打开它的句柄一次(或者保存它,如果你创建了它,或者从第三方获得)。 (3认同)