2011-12-16 13 views
16

私のCコード内でバイナリを実行します。どちらを実行する方が良いですか? popen()またはsystem()Cの中のpopen()とsystem()の違いは何ですか

EDIT:私はsystemを使用しようとしましたが、実行中のプロセスが最後にはまり込むように見えるし、自分のコードには戻りません。

どうすればよいですか?

おかげ

+4

'man popen'と' man system'ですか? –

+0

popen()を使ってみましたか?またはそのバイナリの問題?あなたが最後に行った編集はちょっと混乱しています – henryyao

+0

'system'の代わりに' popen'を使うのはあなたの実際の問題を助けません。 – Wolf

答えて

25

popen()は、プロセスの入力または出力ファイルストリームを制御できます。 system()はありません。プロセスのI/Oにアクセスする必要がない場合は、簡略化のためにsystem()を使用できます。

system()は、C89およびC99にある。 popen()はPosixのみです(Windows APIにもPosixがあります)。

どちらの関数(例えば/bin/sh Linux上で、おそらくcmd.exe Windowsの場合)コマンドを実行するためにシェルのいくつかのフォームを呼び出します。実行ファイルを直接実行し、Posix上にある場合は、fork()exec()が現在のプロセスをに置き換えたため)と組み合わせて機能のexec*ファミリを見ることもできます。

+3

+1、私はpopenがシェルを呼び出すことは決してありませんでした。 –

+1

@HeathHunnicutt:5分前まで、私がヨアヒムの助言に従ったとき、私はしなかった:-) –

+3

'popen'に関する重要な注意点:入力** OR **出力ストリームを制御できます。 –

4

シェルコマンドを実行し、親プロセスが子プロセスと通信できるようにする場合は、popenを使用してください。 (子供の入力または出力を返すストリームまでフックします。)そうでない場合は、execファミリのファンクションを選択します(おそらくforkと組み合わせて使用​​します)。 exec 'プロセスは、オープンファイル記述子(stdin、stdout、stderrを含む)を継承しますので、入力を好きなように出力することができます...さらに、セキュリティの影響も少なくなります。

systemシェルコマンドを実行する必要がない限り、一般的には避けてください。それはコマンドを実行するシェルを生成し、シェルはそれが好きな方法でコマンドを解析することができます。特に、特定の環境変数($IFS$PATHなど)は、親が意図していないプログラムを実行させるように変更することができます。 popenは同じことをしているように見えますが、少なくとも一般的なケースではそれを価値あるものにする機能を提供しています。

+0

あなたは* input *か* outputのどちらかしかできません。 'popen()'もシェルを生成します。 –

関連する問題