【问题标题】:_popen result in a string : a special case_popen 结果为字符串:一种特殊情况
【发布时间】:2012-01-06 04:38:16
【问题描述】:

我的程序的目的是获取字符串中的 cmd 输出,但是有一个奇怪的问题:

string ChangeStatus()
{  status = exec("net stop mysql");
   cout<<status;
   return status;     
}

string exec(char* cmd) 
{
    pipe = _popen(cmd, "r");
    if (!pipe){
        sprintf(returnErrorMSG,"ERROR");
        return returnErrorMSG;
    }

    std::string result = "";
    while(!feof(pipe))
    {
        if(fgets(buffer, 128, pipe) != NULL)
        {
             result +=buffer;
        }
    }
    _pclose(pipe);
    return result;

}

我的目标是捕获命令的输出(作为参数传递给 exec 函数,放入字符串变量 -

现在问题是说,mysql当前正在运行:那么如果我调用函数exec(“net stop mysql”), 它试图停止 mysql 并在函数返回的结果字符串中给出结果。结果字符串包含-“Mysql服务已成功启动” ....没问题。

但是如果mysql当前正在运行并且我调用exec(“net start mysql”),那么它会说“请求的服务已经启动” - 这是完全合理的。我的观点是这条语句应该在 exec 函数的结果字符串中。这次结果字符串只是空的,exec 函数返回一个空字符串。我需要结果字符串中的输出。

【问题讨论】:

    标签: c++ popen


    【解决方案1】:

    在您的情况下,消息转到标准错误流,但 popen() 仅处理标准输出。要捕获消息,您可以使用net stop mysql 2&gt;&amp;1 命令或实现您的popen() 版本,它将同时处理标准输出和标准错误流。

    根据您使用_popen() 而不是popen() 的事实判断,我认为您可能不是为Unix 编写的。所以第一个选项可能不适用于您的操作系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-21
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多