检查应用程序先前启动的进程始终返回进程处于活动状态

时间:2014-03-20 08:39:44

标签: c windows winapi createprocess openprocess

我正在使用CreateProcess创建一个流程:

  • 带有标记CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS
  • InheritHandles param = TRUE
  • startupinfo stdout和stderr文件重定向(STARTF_USESTDHANDLES
  • SECURITY_ATTRIBUTES.InheritHandle = TRUE

进程在继续执行时关闭的句柄。

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

HANDLE HProcess = OpenProcess( 
       PROCESS_QUERY_INFORMATION , TRUE, task->taskPid);

编辑:是的,我正在检查返回的进程是否真的是我查询的进程:

if ( ( HProcess != NULL ) && ( GetProcessId(HProcess) != requestedPid ) )

无论创建的进程是否真的在运行,我都会得到一个有效的进程句柄。如果我重新启动我的应用程序,检查代码将正常工作。我怀疑句柄是以某种方式缓冲的,或者创建的进程在同一组中 - 但我似乎无法在文档中找到有关它的任何信息。

2 个答案:

答案 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
}