_popen результат в строке: особый случай - PullRequest
0 голосов
/ 06 января 2012

Моя цель программы - получить вывод 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 Ответ

2 голосов
/ 06 января 2012

В вашем случае сообщение отправляется в стандартный поток ошибок, но popen() обрабатывает только стандартный вывод. Чтобы перехватить сообщение, вы можете использовать команду net stop mysql 2>&1 или реализовать свою версию popen(), которая будет обрабатывать как стандартный вывод, так и стандартные потоки ошибок.

Судя по тому, что вы используете _popen() вместо popen(), я предполагаю, что вы можете писать не для Unix. Поэтому первый вариант может не работать в вашей ОС.

...