Cコード内でバイナリを実行したい。どちらで実行するのが良いですか? popen()
またはsystem()
[〜#〜] edit [〜#〜]:system
を使おうとしましたが、実行中のプロセスが最後にスタックしているようで、コードに戻りません。
何をすべきかについての提案はありますか?
ありがとう
popen()
を使用すると、プロセスの入力または出力ファイルストリームを制御できます。 system()
はしません。プロセスのI/Oにアクセスする必要がない場合は、簡単にするためにsystem()
を使用できます。
system()
はC89およびC99にあります。 popen()
はPosixのみです(ただし、Windows APIにも1つあります)。
どちらの関数も、なんらかの形式のShellを呼び出して、コマンドを実行します(たとえば、Linuxでは_/bin/sh
_、Windowsではおそらく_cmd.exe
_)。実行可能ファイルを直接実行する必要があり、Posixを使用している場合は、fork()
と組み合わせて_exec*
_-関数ファミリーを確認することもできます(exec()
- 置換現在のプロセス)。
シェルコマンドを実行し、親プロセスが子と通信できるようにする場合は、popen
を使用します。 (子の入力または出力を、返されるストリームにフックします。)それ以外の場合は、exec
ファミリーの関数を優先します(おそらくfork
と組み合わせて)。 exec
'dプロセスは、ほとんどの開いているファイル記述子(stdin、stdout、およびstderrを含む)を継承するため、入力をフックできますおよび出力を好きなものまでフックできます...さらに、セキュリティへの影響が少なくなります。
system
は、シェルコマンドを実行する必要がない限り、通常は避けるのが最善です。コマンドを実行するためにシェルを生成し、シェルはコマンドを好きなように解析できます。特に、特定の環境変数($IFS
および/または$PATH
)意図していなかったプログラムを親に実行させるように、変更することができます。 popen
は同じことをするように見えますが、少なくとも一般的な場合に価値のある機能を提供します。