gpt4 book ai didi

c++ - waitpid() 给出不正确的退出代码

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:21 29 4
gpt4 key购买 nike

我有一个函数可以启动一个进程,然后返回标准输出和退出代码。但是我注意到它声称每个进程都返回 1 的退出代码。我控制被调用的可执行文件并将它打印到标准输出退出代码,所以我已经确认当它“失败”时,它实际上从 main 返回 0。我还直接从 shell 调用了可执行文件,并确认了预期的标准输出和退出代码 (0)。所以错的一定是调用方。我还确认 WIFEXITED 不会返回 false - 它返回 true 就好像 child 已经正常退出(确实如此)。

这段代码在我需要捕获 stdout 之前运行良好,所以它一定与此有关。我试着调查“ child 已经终止”的工作,但在这种情况下并没有发生 - waitpid() 的行为完全符合我的预期,只是不关心 child 在我提名时可能已经终止标准输出。

#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 你就看不到问题。所以如果你从 shell 执行,因为 stderr 没有被重定向,所以一切都很好。

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

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

关于c++ - waitpid() 给出不正确的退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34969512/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com