【问题标题】:Prevent popen from showing a command's output防止 popen 显示命令的输出
【发布时间】:2016-03-29 19:11:24
【问题描述】:

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

【问题讨论】:

  • 我不能重复你的错误。当我运行它时,您的代码对这两个命令的工作方式相同。也许错误在其他地方?
  • 我不这么认为。我的程序只是一个包含以下行的主程序: runcmd("ls -l ~"); runcmd("crontab -l");
  • crontab 命令是否打印错误消息?除非您重定向错误流,否则它将出现在控制台上。
  • 它只是通知“用户没有 crontab -----”。那我应该重定向它吗?
  • 如果您想要错误输出,那么您必须在命令末尾使用2&gt;&amp;1 重定向它。如果您希望能够分别读取输出和错误输出,那么我认为您必须使用fork()

标签: c++ popen


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多