_popen结果是一个字符串:一个特殊情况

_popen result in a string : a special case

本文关键字:一个 情况 字符串 结果是 popen      更新时间:2023-10-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("netstop-mysql"),它试图停止mysql,并在函数返回的结果字符串中给出结果。结果字符串包含-"Mysql服务已成功启动"。。。。没事。

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

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

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

相关文章: