防止 popen 显示命令的输出

Prevent popen from showing a command's output

我正在使用以下 C++ 函数执行简单命令并将其输出到 std::string:

std::string runcmd(std::string cmd)
{
    std::stringstream output;

    FILE *stream = popen(cmd.c_str(), "r");
    char buffer[512];

    if( !stream )
    {
        return "popen error";
    }

    while(fgets(buffer, sizeof(buffer), stream) != NULL)
    {
        output << buffer;
    }

    pclose(stream);
    return output.str();
}

但是我尝试过的每个命令的行为都不相同。例如,如果我调用 "ls -l ~" 一切正常,但如果我调用 "crontab -l",输出将显示在控制台中。我怎样才能防止这种行为?

popen 捕获 stdout,而不是 stderr。它只为输出创建一个管道,所以@Galik 的评论是正确的。使用 2>&1 将 stderr(2) 重定向到 stdout(1),或 fork 进程并手动处理所有三个流。