_popen导致字符串:一个特例

时间:2012-01-06 04:38:17

标签: c++ popen

我的程序的目的是将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函数返回一个空字符串。我需要在结果字符串中输出。

1 个答案:

答案 0 :(得分:2)

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

根据您使用_popen()而不是popen()这一事实判断,我认为您可能不会写Unix。因此,第一个选项可能无法在您的操作系统中运行。