Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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 检查以前由应用程序启动的进程总是返回活动进程_C_Windows_Winapi_Createprocess_Openprocess - Fatal编程技术网

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
  • InheritHandles
    param=
    TRUE
  • startupinfo标准输出和标准输出文件重定向(
    STARTF_USESTDHANDLES
  • SECURITY\u ATTRIBUTES.InheritHandle=TRUE
进程的句柄在继续执行时关闭

然后,我通过获取具有给定PID的进程的句柄来检查进程状态:

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解决方案可能会失败。等待进程句柄发出信号要容易得多