2017-05-24 136 views
2

如果我通过CreateProcess()创建了一个流程,我将如何确定它是否仍在运行?我知道我需要使用pi.hProcess,但我不知道如何,谷歌并没有真正给我有意义的提示。如何判断用CreateProcess启动的进程是否仍在运行?

PROCESS_INFORMATION pi; 
STARTUPINFO si; 
ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 
bool got_it=CreateProcess(NULL, CA2T(launchString.c_str()), NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); 

回答

6

您可以使用任何标准wait functions,像WaitForSingleObject(),例如:

switch (WaitForSingleObject(pi.hProcess, 0)) 
{ 
    case WAIT_OBJECT_0: 
     // process has terminated... 
     break; 

    case WAIT_TIMEOUT: 
     // process is still running... 
     break; 
} 
0

您可以GetExitCodeProcess()检索过程的退出代码,这将给特殊STILL_ACTIVE值,如果进程仍在运行:

DWORD exit_code; 
GetExitCodeProcess(pi.hProcess, &exit_code); 
if (exit_code == STILL_ACTIVE) { 

} 
+3

如果进程返回'STILL_ACTIVE'(259)作为其实际退出代码会怎么样? – zett42

+0

@ zett42:这是一种可能性,并且文档会警告:“***重要** GetExitCodeProcess函数只有在线程终止后才会返回应用程序定义的有效错误代码。因此,应用程序不应该使用'STILL_ACTIVE'(259)作为错误代码,如果一个线程返回'STILL_ACTIVE'(259)作为错误代码,那么测试该值的应用程序可以将其解释为意味着线程仍在运行并继续测试线程终止后线程的完成,这可能会导致应用程序陷入无限循环。*“ –

+0

@Remy所以这不是一个通用的解决方案,因为它需要其他进程的协作。改用'WaitForSingleObject()'来代替0超时。 – zett42

相关问题