2017-02-22 12 views
-4

コマンドが成功したかCに存在するかをどのように判断できますか?これは、複数のアーキテクチャやルータと互換性がある必要があります(hahaを聞かないでください)コマンドが成功したかどうかを判断するc

私はpopenやsystem、exec(v)(l)の使用を考えていました。しかし、私がチェックしたいコマンドはsendmailです。 sendmailは出力なしで永久に実行するコマンドなので、これは少し難しいでしょう。何か案は?

ありがとうございます。

+0

コマンドのパスを知っていれば、単に 'stat'を実行して実行可能ファイルかどうか確認するのはなぜですか? – codeforester

+0

[linuxのC/C++プログラムからの電子メールの送信]の複製(0120-18753)。 –

+0

CURLはもう一つの良い点です電子メールを送信する方法。 –

答えて

1

sendmailへのパスがわかっている場合は、コメントごとにstatを使用して存在し、実行可能であることを確認してください。検索パスを知っている場合は、それを繰り返して、それぞれを確認してください。

もしそうでない場合 - /dev/nullをstdinとして渡すことができます。この場合、エラーメッセージが表示され、終了します。もちろん

int rc = system("sendmail </dev/null 2>/dev/null"); 
if (WEXITSTATUS(rc)!=127) { 
    /* sendmail was found */ 
} 

はこれが存在する/dev/nullを必要とし、シェルが利用できるようにリダイレクトします:コマンドが実行できなかった場合はPOSIXシステムのため、終了コードは127になります - そして、あなたは、プロセスの終了コードを検査することができます。

私はstderrもリダイレクトしました。そうしないと、sendmailからエラーメッセージが出力されます。

+0

'system'関数は' sendmail'が終了したり終了しなかった場合には返りません。 –

+0

@BasileStarynkevitchあなたが/ dev/nullからそれをフィードすると終了します。上記のように起動すると、標準入力から – harmic

+0

を読み込もうとします。ありがとうございます。これはまさに私が必要としていたものです。 – N3Cr0M0rPh

0

ちょうどそれを使用しようとします。それがあれば、それを実行することができます、それは動作します。それがなければ、それはしないでしょう、あなたはなぜerrnoで見ることができます。

事前にチェックしようとしない理由は二重であり、実行可能ファイルと同じです。まず、チェックが間違っている可能性があります。多くの人がファイルが存在するかどうかを確認する間違いを犯します。なぜそれを開くのが失敗するのだろうか。読めるかどうかチェックするのを忘れてしまった。これらのチェックをすべて複製する必要はありません。ただ開いてみてください。

第2は、race conditionを招待しています。たとえば、同じファイルを処理する2つのプロセスがあるとします。時が流れている。

Process 1        Process 2 
Check if file is readable. 
It's readable! 
             Make the file unreadable. 
Open that file. 
File fails to open. 

これは非常に単純な例です。競合状態にはるかに悪い影響があります。リソースが使用できるかどうかの確認とそのリソースの使用は、atomicでなければならないことを示しています。これは、単一の無停止操作で行わなければなりません。


popensystemすることができますを避けてください。コマンドはシェルを介して実行され、英数字以外の文字のセキュリティホールや意図しない結果を招きます。代わりに、exec[lv]p関数のいずれかを使用して、PATHを検索してシェルを起動せずに実行可能ファイルを探します。

関連する問題