2016-10-05 20 views
-3

C++でsystem("foocmd param1")を使用してunixコマンドを実行しているとします。 foocmdがstderrを介して端末に「無効な引数」を返した場合、foocmdが失敗したかどうかをC++コードでどのように取得できますか?ここで"system(cmd)"から実行されたコマンドが失敗したかどうかをC++コードに知らせるにはどうすればよいですか?

は私の未遂ソリューションです:

私の仮定は、私は何がコマンドを呼び出すことにより、標準エラー出力に戻ってしまったかどうかを確認すべきであるということです。 これを行うには、私はpopenに切り替えることを試みた。現在、これが私がチェックする方法です。最初にstderrをファイルに出力します。

sprintf(cmd, "foocmd param1 2>temp.txt"); 
system(cmd); 

次に、temp.txtが空であるかどうかを確認します。

しかし、もっと良い方法があります。誰も私に手を貸すことができますか?

+5

を 'ステータスコードを返しますsystem'。 –

+2

[マニュアルページを読む](http://man7.org/linux/man-pages/man3/system.3.html)。 –

+2

[Cでのシステム()の戻り値の重複の可能性があります](http://stackoverflow.com/questions/8654089/return-value-of-system-in-c) – Hayt

答えて

2

通常の方法ではsystem()の戻り値を調べることです。

  • それがゼロなら、コマンドが正常に実行され、0の状態で終了しました。
  • それが否定的な場合は、system()自体に問題があり、何も想定できません。
  • 肯定的な場合は、WEXITSTATUS()と関連するマクロを使用して、プロセスがどのように終了したかを調べることができます。

詳しくは、system(3)のマニュアルページを参照してください。


時間の大半は、あなただけのコマンドは、それが成功したと言うかどうかに興味がある:

if (!system(cmd)) { 
    syslog(LOG_WARNING, "Command \"%s\" failed", cmd); 
    /* maybe some more error handling here */ 
    goto err_return; 
} 
+0

私は探している終了コードを把握するのが面倒だとは思われませんか?私が読んだところでは、終了コードの規則がないように思えます。コードの仕方によって異なります。それは、すべてがエラーであっても、複数の終了コードが存在する可能性があると思われます。 – CuriousKimchi

+1

ほとんどの場合、単純に0に対してテストするだけで十分です。 'if(!system(cmd)){/ * error handling * /}'はあまり面倒ではありません。必要なときには複雑にしか支払わない。 –

関連する問題