web-dev-qa-db-ja.com

Cのpopen()とsystem()の違いは何ですか

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

[〜#〜] edit [〜#〜]systemを使おうとしましたが、実行中のプロセスが最後にスタックしているようで、コードに戻りません。

何をすべきかについての提案はありますか?

ありがとう

21
Syntax_Error

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

system()はC89およびC99にあります。 popen()はPosixのみです(ただし、Windows APIにも1つあります)。

どちらの関数も、なんらかの形式のShellを呼び出して、コマンドを実行します(たとえば、Linuxでは_/bin/sh_、Windowsではおそらく_cmd.exe_)。実行可能ファイルを直接実行する必要があり、Posixを使用している場合は、fork()と組み合わせて_exec*_-関数ファミリーを確認することもできます(exec()- 置換現在のプロセス)。

34
Kerrek SB

シェルコマンドを実行し、親プロセスが子と通信できるようにする場合は、popenを使用します。 (子の入力または出力を、返されるストリームにフックします。)それ以外の場合は、execファミリーの関数を優先します(おそらくforkと組み合わせて)。 exec'dプロセスは、ほとんどの開いているファイル記述子(stdin、stdout、およびstderrを含む)を継承するため、入力をフックできますおよび出力を好きなものまでフックできます...さらに、セキュリティへの影響が少なくなります。

systemは、シェルコマンドを実行する必要がない限り、通常は避けるのが最善です。コマンドを実行するためにシェルを生成し、シェルはコマンドを好きなように解析できます。特に、特定の環境変数($IFSおよび/または$PATH)意図していなかったプログラムを親に実行させるように、変更することができます。 popenは同じことをするように見えますが、少なくとも一般的な場合に価値のある機能を提供します。

5
cHao