【发布时间】:2014-03-20 08:39:44
【问题描述】:
我正在使用CreateProcess 创建一个进程:
- 带有标志
CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS -
InheritHandles参数 =TRUE - startupinfo 标准输出和标准错误文件重定向 (
STARTF_USESTDHANDLES) -
SECURITY_ATTRIBUTES.InheritHandle = TRUE
进程在继续执行时关闭的句柄。
然后我通过获取具有给定 PID 的进程的句柄来检查进程状态:
HANDLE HProcess = OpenProcess(
PROCESS_QUERY_INFORMATION , TRUE, task->taskPid);
编辑:是的,我正在检查返回的进程是否真的是我查询的进程:
if ( ( HProcess != NULL ) && ( GetProcessId(HProcess) != requestedPid ) )
无论创建的进程是否真的在运行,我都会得到该进程的有效句柄。如果我重新启动我的应用程序,检查代码将正常工作。我怀疑句柄以某种方式被缓冲,或者创建的进程在同一个组中 - 但我似乎无法在文档中找到任何有关它的信息。
【问题讨论】:
-
您获得的是
the进程的有效句柄还是a进程的有效句柄?我认为 Windows 重用了进程标识符。 -
这是 有效句柄。
-
值得我阅读the documentation for OpenProcess,它引起了社区的好奇:当一个进程不存在时,OpenProcess 将一个句柄返回给下一个较低的进程 pid
-
为什么不等待CreateProcess返回的进程句柄呢?
-
它不值得作为答案发布,这是众所周知的事实:当进程退出时,处理的进程会发出信号。因此,您可以使用任何等待函数(如 WaitForSingleObject)来准确了解进程何时退出。重用进程句柄时,您的 GetExitCodeProcess 解决方法可能会失败。
标签: c windows winapi createprocess openprocess