私のCコード内でバイナリを実行します。どちらを実行する方が良いですか? popen()
またはsystem()
Cの中のpopen()とsystem()の違いは何ですか
EDIT:私はsystem
を使用しようとしましたが、実行中のプロセスが最後にはまり込むように見えるし、自分のコードには戻りません。
どうすればよいですか?
おかげ
私のCコード内でバイナリを実行します。どちらを実行する方が良いですか? popen()
またはsystem()
Cの中のpopen()とsystem()の違いは何ですか
EDIT:私はsystem
を使用しようとしましたが、実行中のプロセスが最後にはまり込むように見えるし、自分のコードには戻りません。
どうすればよいですか?
おかげ
popen()
は、プロセスの入力または出力ファイルストリームを制御できます。 system()
はありません。プロセスのI/Oにアクセスする必要がない場合は、簡略化のためにsystem()
を使用できます。
system()
は、C89およびC99にある。 popen()
はPosixのみです(Windows APIにもPosixがあります)。
どちらの関数(例えば/bin/sh
Linux上で、おそらくcmd.exe
Windowsの場合)コマンドを実行するためにシェルのいくつかのフォームを呼び出します。実行ファイルを直接実行し、Posix上にある場合は、fork()
(exec()
が現在のプロセスをに置き換えたため)と組み合わせて機能のexec*
ファミリを見ることもできます。
+1、私はpopenがシェルを呼び出すことは決してありませんでした。 –
@HeathHunnicutt:5分前まで、私がヨアヒムの助言に従ったとき、私はしなかった:-) –
'popen'に関する重要な注意点:入力** OR **出力ストリームを制御できます。 –
シェルコマンドを実行し、親プロセスが子プロセスと通信できるようにする場合は、popen
を使用してください。 (子供の入力または出力を返すストリームまでフックします。)そうでない場合は、exec
ファミリのファンクションを選択します(おそらくfork
と組み合わせて使用します)。 exec
'プロセスは、オープンファイル記述子(stdin、stdout、stderrを含む)を継承しますので、入力とを好きなように出力することができます...さらに、セキュリティの影響も少なくなります。
system
シェルコマンドを実行する必要がない限り、一般的には避けてください。それはコマンドを実行するシェルを生成し、シェルはそれが好きな方法でコマンドを解析することができます。特に、特定の環境変数($IFS
や$PATH
など)は、親が意図していないプログラムを実行させるように変更することができます。 popen
は同じことをしているように見えますが、少なくとも一般的なケースではそれを価値あるものにする機能を提供しています。
あなたは* input *か* outputのどちらかしかできません。 'popen()'もシェルを生成します。 –
'man popen'と' man system'ですか? –
popen()を使ってみましたか?またはそのバイナリの問題?あなたが最後に行った編集はちょっと混乱しています – henryyao
'system'の代わりに' popen'を使うのはあなたの実際の問題を助けません。 – Wolf