Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查进程ID时使用WaitForSingleObject的好处_C++_Winapi_Pid - Fatal编程技术网

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

C++ 检查进程ID时使用WaitForSingleObject的好处,c++,winapi,pid,C++,Winapi,Pid,在这里使用WaitForSingleObject与不使用它相比有什么好处?第一个代码块来自一个。第二个问题是我是怎么做的 BOOL IsProcessRunning(DWORD pid) { HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid); DWORD ret = WaitForSingleObject(process, 0); CloseHandle(process); return (ret == W

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

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


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

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

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


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

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

零超时是Ingeniosis的一部分(希望我拼写正确),它会立即超时(=进程正在运行)或失败(=僵尸进程)。要添加一些比较工作,您可能需要将
GetExitCode
WaitForSingleObject
进行比较,以确定进程完成状态。如果进程故意返回259(
仍处于活动状态
),该怎么办作为它的退出代码?我还想添加一个进程ID,从理论上讲,它可以被重用。因此,每次都用它的ID打开进程通常不是一个好主意。最好打开它的句柄一次(或者保存它,如果你创建了它,或者从第三方获得了它)。
BOOL IsProcessRunning(DWORD pid)
{
   HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
   const bool exists = (process != NULL);
   CloseHandle(process);
   return exists;
}