获取退出代码总是返回 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_INFORMATIONPROCESS_QUERY_LIMITED_INFORMATION 访问将有效进程句柄传递给api - GetExitCodeProcess 将返回true。因为procinfo.hProcess 始终有效并且具有所需的访问权限 - GetExitCodeProcess 并且必须始终返回 true 并且仅当GetExitCodeProcess返回true时才寻找exitcode退出意义。但你做的相反 - 看看失败,有什么问题。然后你从 3 个地方关闭句柄,而不是单个 【参考方案1】:

您应该查看退出代码,而不是崩溃;

返回值

如果函数成功,返回值非零。

如果函数失败,返回值为零。获得扩展错误 信息,调用GetLastError。

【讨论】:

以上是关于获取退出代码总是返回 1的主要内容,如果未能解决你的问题,请参考以下文章

通过 .bat 执行 Sqlplus 总是返回 0

出现错误时,VirtualBox startvm 命令总是返回退出代码 0

如何获取使用 perf stat 运行的程序的退出代码?

IBM Z/os Rexx 脚本返回 255 退出代码

如果代码不为0,则无法获取erlang escript退出代码

从最后一个管道(stdin)获取退出代码