popen() 将执行命令的输出写入 cout

popen() writes output of command executed to cout

本文关键字:输出 cout 命令 执行 popen      更新时间:2023-10-16

我正在编写一个应用程序,需要打开另一个进程并获取其输出。我在网上读到的任何地方都说我必须使用popen并从文件中读取。

但我无法从中阅读。命令的输出将输出到调用应用程序的控制台窗口中。下面是我正在使用的代码。我添加了一些打印来调试。

#include <string>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <array>
int main()
{
// some command that fails to execute properly.
std::string command("ls afskfksakfafkas");
std::array<char, 128> buffer;
std::string result;
std::cout << "Opening reading pipe" << std::endl;
FILE* pipe = popen(command.c_str(), "r");
if (!pipe)
{
std::cerr << "Couldn't start command." << std::endl;
return 0;
}
while (fgets(buffer.data(), 128, pipe) != NULL) {
std::cout << "Reading..." << std::endl;
result += buffer.data();
}
auto returnCode = pclose(pipe);
std::cout << result << std::endl;
std::cout << returnCode << std::endl;
return 0;
}

阅读实际上从未打印到我的cout结果是一个空字符串。我在终端中清楚地看到了命令的输出。如果命令正常退出,则行为符合预期。但我只捕获错误情况下的输出。

Popen 不会只捕获 stderr。将标准输出重定向到标准输出可以解决此问题。

#include <string>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <array>
int main()
{
std::string command("ls afskfksakfafkas 2>&1");
std::array<char, 128> buffer;
std::string result;
std::cout << "Opening reading pipe" << std::endl;
FILE* pipe = popen(command.c_str(), "r");
if (!pipe)
{
std::cerr << "Couldn't start command." << std::endl;
return 0;
}
while (fgets(buffer.data(), 128, pipe) != NULL) {
std::cout << "Reading..." << std::endl;
result += buffer.data();
}
auto returnCode = pclose(pipe);
std::cout << result << std::endl;
std::cout << returnCode << std::endl;
return 0;
}

你必须在命令字符串的末尾添加"2>&1">

command.append(" 2>&1");

有一个完整的示例 https://www.jeremymorgan.com/tutorials/c-programming/how-to-capture-the-output-of-a-linux-command-in-c/