【发布时间】:2018-11-20 20:40:16
【问题描述】:
我正在从事一个包含线程和进程的项目。我打开多线程,并为每个线程打开一个运行 exe 文件的进程。 如果程序以非 0 的返回值结束,则会崩溃,并且应该打印返回值。为了获得返回值,我使用了 WIN API 函数 GetExitCodeProcess() 我的问题是这个函数总是返回值 1,即使程序应该崩溃,但为什么呢? 这是我的相关代码:
static DWORD WINAPI RunningTests(test_s *test)
{
PROCESS_INFORMATION procinfo;
DWORD waitcode;
DWORD exitcode;
int status = 0, crashed = 0;
char cmdLineString[MAX_NUMBER_OF_CHARS_IN_CMD_LINE]="";
char *cmdLineStringPtr = cmdLineString;
(test)->isCrashed = 0;
CreateCmdLine((*test).testExePath, &cmdLineStringPtr);
status = CreateProcessSimple(_T(cmdLineString), &procinfo);
if (status == -1)
{
return 1;
}
waitcode = WaitForSingleObject(procinfo.hProcess,
TIME_UNTIL_TIMED_OUT_IN_MILLISEC);
if (waitcode == WAIT_TIMEOUT) /* Process is still alive */
{
strcpy((*test).status, "Timed Out");
CloseHandle(procinfo.hProcess);
CloseHandle(procinfo.hThread);
return 0;
}
crashed = GetExitCodeProcess(procinfo.hProcess, &exitcode);
if (crashed == 0) /* Process is crashed */
{
strcpy((*test).status, "Crashed");
(*test).isCrashed = 1;
(*test).returnedCrashedValue = exitcode;
CloseHandle(procinfo.hProcess);
CloseHandle(procinfo.hThread);
return 0;
}
CloseHandle(procinfo.hProcess);
CloseHandle(procinfo.hThread);
return CompareFiles(&test);
}
【问题讨论】:
-
来自 MSDN:如果函数成功,则返回值非零。如果函数失败,则返回值为零。要获取扩展错误信息,请调用 GetLastError。
-
如何
GetExitCodeProcess成功或失败与进程崩溃有关?!如果您通过PROCESS_QUERY_INFORMATION或PROCESS_QUERY_LIMITED_INFORMATION访问将有效进程句柄传递给api -GetExitCodeProcess将返回true。因为procinfo.hProcess始终有效并且具有所需的访问权限 -GetExitCodeProcess并且必须始终返回 true -
并且仅当
GetExitCodeProcess返回true时才寻找exitcode退出意义。但你做的相反 - 看看失败,有什么问题。然后你从 3 个地方关闭句柄,而不是单个