获取退出代码总是返回 1
Posted
技术标签:
【中文标题】获取退出代码总是返回 1【英文标题】:get exit code always returns 1 【发布时间】: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 个地方关闭句柄,而不是单个
【参考方案1】:
您应该查看退出代码,而不是崩溃;
返回值
如果函数成功,返回值非零。
如果函数失败,返回值为零。获得扩展错误 信息,调用GetLastError。
【讨论】:
以上是关于获取退出代码总是返回 1的主要内容,如果未能解决你的问题,请参考以下文章
出现错误时,VirtualBox startvm 命令总是返回退出代码 0