防止popen显示命令的输出

时间:2016-03-29 19:11:25

标签: c++ popen

我正在使用以下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”,则输出显示在控制台中。我该如何防止这种行为?

1 个答案:

答案 0 :(得分:2)

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