C++ 中执行并获取命令行输出(包括 stderr)

作者: , 共 866 字 , 共阅读 0

popen函数可以获取比std::system函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。

因此可以简单用sh -c '{}' 2>&1封装一下命令,将 stderr 重定向到 stdout ,再执行 popen 获取所有的输出:

std::pair<int, std::string> exec(std::string command, bool with_stderr = true)
{
    char buffer[1280];
    std::string result = "";

    if (with_stderr) {
        command = fmt::format("sh -c '{}' 2>&1", command);
    }

    FILE* pipe = popen(command.c_str(), "r");
    if (!pipe) {
        return {errno, fmt::format("popen failed: {}", strerror(errno))};
    }

    // read till end of process:
    while (!feof(pipe)) {
        // use buffer to read and add to result
        if (fgets(buffer, sizeof(buffer), pipe) != NULL)
            result += buffer;
    }

    pclose(pipe);
    return {0, result};
}

使用中要注意,命令中不能包含单引号。另外过于复杂的命令也可能有问题。

Q. E. D.

类似文章:
编程 » popen, C++
我们在 C++里可以这么查看popen是否正常执行:
编程 » C++, fmt
C++的fmt::format格式化库,由于效率高,功能强大,相关的 API 已经进入C++20,但其文档和 API 细节无法恭维。
获取程序占用的内存量,是一个诡异的需求。但程序写多了,有时候还真需要,尤其是代码运行出现问题的时候。
编程 » C++
如果我们用std::getline或者简单的std::cin >>获取用户输入,有一个问题是,它会阻塞掉整个程序,用户必须有输入后才能继续执行。如果这个输入是单独的线程,它还会阻止整个程序的退出。
编程 » C++, boost, 命令行
我们用boost的命令行库program_options解析命令行,在解释布尔命令行时使用下面代码:
编程 » C++
要在C++中运行系统命令,可以直接使用std::system函数:
编程 » C++, 异步
C++11 的标准异步库至少包含下面内容:
编程 » C++
现在一般不能用 sprintf 和 strcpy ,推荐使用 snprintf 和 strncpy ,以防止缓冲区溢出:
编程 » Shell, VBA
某些时候,我们需要在 Excel 中调用命令行或者 Bash 脚本, VBA 可以通过 Shell 函数很方便地做到这一点。以下用ipconfig /all来举例,这条命令行语句用来获得机器的网路配置信息,包括 IP、网关等信息。它可以替换成任何一个 bash 脚本和命令行代码。
编程 » C++
有两种方法,一种在线程的调用函数内部设置,还有一种是在外部对指定线程变量做设置。
该路线从后花园景区进入。上山穿过八十一山洞,特有意思。下山非常陡峭。因此虽然路程只有 6 公里,爬升 400 ,难度却也不低。
Pyhon 的抽象基类( abstruct base class )库abc定义了类似于 C++的纯虚函数的功能: