C 检查以前由应用程序启动的进程总是返回活动进程
我正在使用C 检查以前由应用程序启动的进程总是返回活动进程,c,windows,winapi,createprocess,openprocess,C,Windows,Winapi,Createprocess,Openprocess,我正在使用CreateProcess创建一个流程: 使用标志CREATE_NO_WINDOW | CREATE_breakout_FROM_JOB | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS InheritHandlesparam=TRUE startupinfo标准输出和标准输出文件重定向(STARTF_USESTDHANDLES) SECURITY\u ATTRIBUTES.InheritHandle=TRUE 进程的句柄在继续执行时关闭
CreateProcess
创建一个流程:
- 使用标志
CREATE_NO_WINDOW | CREATE_breakout_FROM_JOB | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS
param=InheritHandles
TRUE
- startupinfo标准输出和标准输出文件重定向(
)STARTF_USESTDHANDLES
SECURITY\u ATTRIBUTES.InheritHandle=TRUE
HANDLE HProcess = OpenProcess(
PROCESS_QUERY_INFORMATION , TRUE, task->taskPid);
编辑:是的,我正在检查返回的流程是否确实是我查询的流程:
if ( ( HProcess != NULL ) && ( GetProcessId(HProcess) != requestedPid ) )
无论所创建的进程是否真正正在运行,我都会获得该进程的有效句柄。如果重新启动应用程序,检查代码将正常工作。我怀疑句柄以某种方式被缓冲,或者创建的进程在同一组中-但我似乎在文档中找不到任何关于它的信息。虽然这不是一个答案,但它确实可以作为一种解决方法:
拥有有效句柄后,可以检查流程是否已完成:
DWORD exitCode = 0;
GetExitCodeProcess(HProcess, &exitCode);
if (exitCode == STILL_ACTIVE ) {
//task alive (or exited with STILL_ACTIVE :( )
} else {
//task exited with code exitCode
}
无法保证成功打开进程句柄意味着该进程仍在运行。所以你所描述的行为并不令人惊讶 打开句柄后,可以轻松检查进程是否已完成:
DWORD dw = WaitForSingleObject(handle, 0);
if (dw == WAIT_OBJECT_0)
{
// Process has exited
}
但是,您的方法从一开始就是有缺陷的,因为您无法判断流程ID是否已被重用。不要存储进程ID,而是存储CreateProcess返回的进程句柄,并使用它来测试进程是否退出,如图所示。您是获得了
进程的有效句柄还是进程的有效句柄?我认为Windows重新使用了进程标识符。这是一个有效的句柄。值得一读的是,社区对此很好奇:当一个进程不存在时,OpenProcess会将一个句柄返回给下一个较低的进程。为什么不等待CreateProcess返回的进程句柄?它不值得作为答案发布,这是一个众所周知的事实:当进程退出时,会发出处理进程的信号。因此,您可以使用任何等待函数(如WaitForSingleObject)准确地知道进程何时退出。当重新使用进程句柄时,GetExitCodeProcess解决方案可能会失败。等待进程句柄发出信号要容易得多