waitpid() 给出了不正确的退出代码
waitpid() gives incorrect exit code
>我有一个函数,用于启动一个进程,然后返回标准输出和退出代码。但是我注意到它声称每个进程都返回退出代码 1。我控制正在调用的可执行文件,并让它打印出来以标准输出退出代码,所以我确认当它"失败"时,它实际上从main
返回 0。我还直接从 shell 调用可执行文件,并确认了预期的标准输出和退出代码 (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,你看不到问题。因此,如果您从 shell 执行,因为 stderr 没有重定向,所以一切都很好。
因此,尽管 shell 和我自己的返回代码一致,但该过程实际上返回了退出代码 1。
显然问题在主干中已经解决,或者应该解决,但我仍在使用 3.6。
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- 特征 LLT 模块给出不正确的结果?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 如果语句逻辑不正确
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 不正确的操作数类型 MSVC
- 数组填充了不正确的值
- 我是否不正确地集中了这些字符数组?
- 为什么除非我使用 cout,否则我的值不正确?
- 计算幂级数的数学结果不正确
- 为什么 sizeof 在 C++ 中给出不正确的字节数?
- atoi() 在应用于大型命令行参数时会产生不正确的值
- waitpid() 给出了不正确的退出代码