waitpid()给出了错误的退出代码

时间:2016-01-23 22:10:49

标签: c++ linux

我有一个启动进程的函数,然后返回stdout和退出代码。但是我注意到它声称每个进程都返回1的退出代码。我控制了被调用的可执行文件,并且我将它打印到stdout退出代码,所以我确认了它的时候&#34 ;失败",它实际上从main返回0。我还直接从shell调用可执行文件并确认了预期的stdout和退出代码(0)。因此,错误必须位于呼叫者的一侧。我也确认WIFEXITED没有返回false-它返回true,好像孩子已经正常退出(它确实已经退出)。

这个代码在我需要捕获stdout之前工作正常,所以它必须与之有关。我试着调查&#34;孩子已经终止&#34;求职,但在这种情况下没有发生 - waitpid()的行为与我期望的完全一样,并且我并不关心孩子在我命名stdout时可能已经终止。< / p>

#include <unistd.h>    
#include <sys/types.h>    
#include <sys/wait.h> 
#include <iostream>

Wide::Driver::ProcessResult Wide::Driver::StartAndWaitForProcess(std::string name, std::vector<std::string> args, Util::optional<unsigned> timeout) {
    int filedes[2];
    pipe(filedes);


    pid_t pid = fork();

    if (pid == 0) {
        while ((dup2(filedes[1], STDOUT_FILENO) == -1) && (errno == EINTR)) {}
        freopen("/dev/null", "rw", stdin);
        freopen("/dev/null", "rw", stderr);
        //close(filedes[0]);

        std::vector<const char*> cargs;

        cargs.push_back(name.c_str());

        for (auto&& arg : args)

            cargs.push_back(arg.c_str());

        cargs.push_back(nullptr);

        execv(name.c_str(), const_cast<char* const*>(&cargs[0]));

    }
    std::string std_out;
    close(filedes[1]);
    char buffer[4096];
    while (1) {
        ssize_t count = read(filedes[0], buffer, sizeof(buffer));
        if (count == -1) {
            if (errno == EINTR) {
                continue;
            } else {
                perror("read");
                exit(1);
            }
        } else if (count == 0) {
            break;
        } else {
            std_out += std::string(buffer, buffer + count);
        }
    }
    close(filedes[0]);

    int status;
    ProcessResult result;
    result.std_out = std_out;
    waitpid(pid, &status, 0);

    if (!WIFEXITED(status))

        result.exitcode = 1;

    else {
        result.exitcode = WEXITSTATUS(status);
        if (result.exitcode != 0) {
            std::cout << name << " failed with code " << result.exitcode << "\n";
            std::cout << "stdout: " << result.std_out;
        }
    }
    return result;
}

为什么在地球上是waitpid()给我这个奇怪的结果,我该如何解决?

1 个答案:

答案 0 :(得分:0)

我在IRC中确认这是一个LLVM问题。我打印出的进程的退出代码是我从main返回的内容 - 静态析构函数或其他此类代码仍然可以运行并调用exit(1)。这是由重定向stderr引起的 - 所以基本上你不能得到错误,因为如果你没有重定向stderr,你就不会看到问题。因此,如果你从shell执行,因为stderr没有被重定向,所以它都很好。

因此,尽管shell和我自己的返回代码达成一致,但该进程实际上是返回1的退出代码。

显然问题是在trunk中解决,或者应该是,但我仍在使用3.6。