2012-01-06 9 views
0

私の目的は、文字列にcmdと出力を得ることですが、奇妙な問題があります:_popen結果:プログラムの特殊なケース

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関数は空の文字列を返します。結果の文字列にその出力が必要です。

答えて

2

あなたの場合、メッセージは標準エラーストリームに送られますが、popen()は標準出力のみを処理します。メッセージをキャッチするには、net stop mysql 2>&1コマンドを使用するか、標準出力ストリームと標準エラーストリームの両方を処理するバージョンpopen()を実装します。

popen()の代わりに_popen()を使用していると判断して、私はあなたがUnix用ではないと判断します。したがって、最初のオプションはお使いのOSで動作しない可能性があります。

関連する問題