我正在使用CreateProcess
创建一个流程:
CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS
InheritHandles
param = TRUE
STARTF_USESTDHANDLES
)SECURITY_ATTRIBUTES.InheritHandle = TRUE
进程在继续执行时关闭的句柄。
然后我通过获取给定PID的进程句柄来检查进程状态:
HANDLE HProcess = OpenProcess(
PROCESS_QUERY_INFORMATION , TRUE, task->taskPid);
编辑:是的,我正在检查返回的进程是否真的是我查询的进程:
if ( ( HProcess != NULL ) && ( GetProcessId(HProcess) != requestedPid ) )
无论创建的进程是否真的在运行,我都会得到一个有效的进程句柄。如果我重新启动我的应用程序,检查代码将正常工作。我怀疑句柄是以某种方式缓冲的,或者创建的进程在同一组中 - 但我似乎无法在文档中找到有关它的任何信息。
答案 0 :(得分:1)
无法保证成功打开进程句柄意味着进程仍在运行。所以你所描述的行为并不令人惊讶。
打开句柄后,您可以轻松检查过程是否已完成:
DWORD dw = WaitForSingleObject(handle, 0);
if (dw == WAIT_OBJECT_0)
{
// Process has exited
}
但是,您的方法一开始就存在缺陷,因为您无法确定进程ID是否已被重用。而不是存储进程ID,而是存储从CreateProcess返回的进程句柄,并使用它来测试进程退出,如图所示。
答案 1 :(得分:0)
虽然这不是一个答案,但它可以作为一种解决方法:
拥有有效句柄,可以检查过程是否已完成:
DWORD exitCode = 0;
GetExitCodeProcess(HProcess, &exitCode);
if (exitCode == STILL_ACTIVE ) {
//task alive (or exited with STILL_ACTIVE :( )
} else {
//task exited with code exitCode
}