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

Joh*_*ith 3 c++ file popen

我正在编写一个应用程序,需要打开另一个进程并获得它的输出.在线我无处不在,我必须使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

小智 6

您必须在命令字符串的末尾添加“2>&1”

command.append(" 2>&1");
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*ith 5

Popen没有捕获stderr stdout.将stderr重定向到stdout可以解决问题.

#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;
}
Run Code Online (Sandbox Code Playgroud)