簡體   English   中英

waitpid()提供錯誤的退出代碼

[英]waitpid() gives incorrect exit code

我有一個用於啟動進程,然后返回標准輸出和退出代碼的函數。 但是,我注意到它聲稱每個進程都返回退出代碼1。我控制了正在執行的可執行文件,並打印了該輸出以標出退出代碼,因此我已經確認,當它“失敗”時,實​​際上從main返回0。 我還直接從外殼程序調用了可執行文件,並確認了預期的標准輸出和退出代碼(0)。 因此,故障必須出在呼叫者一方。 我還確認了WIFEXITED不會返回false-就像孩子正常退出一樣返回true。

在我需要捕獲stdout之前,這段代碼可以正常工作,因此它必須與此有關。 我嘗試查看“孩子已經終止”作業,但是在這種情況下沒有發生-waitpid()的行為與我期望的完全一樣,只是不在乎孩子在我命名時可能已經終止了。標准輸出。

#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()會給我這個奇怪的結果,我該如何解決呢?

我已經在IRC中確認這是LLVM問題。 我打印出的進程的退出代碼是我從main返回的-靜態析構函數或其他此類代碼仍然可以運行並調用exit(1) 這是由重定向stderr引起的-因此,基本上,您不會收到錯誤,因為如果不重定向stderr,則不會看到問題。 因此,如果您從外殼執行,由於不會重定向stderr,因此一切都很好。

因此,盡管外殼程序和我自己的返回碼一致,但實際上該過程返回的是退出碼1。

顯然,該問題已在樹干中解決,或者應該已經解決,但我仍在使用3.6。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM