16

UNIX で C から外部実行可能ファイルを実行するには、2 つの一般的な方法があるようです。

system()

電話して

pid = fork()
switch(pid)
//switch statement based on return value of pid, 
//one branch of which will include and exec() command

機能的に同等である場合に、システムよりも fork/exec を優先する理由はありますか (親プロセスは子プロセスの終了を待機し、子プロセスから複雑な情報は返されません)。

4

4 に答える 4

20

systemコマンドインタープリター、つまりシェルを実行します。これは、(a) 直接の fork/exec よりも低速であり、(b) 異なるシステムでは異なる動作をする可能性があり、(c) 信頼されていないサーバーから文字列を渡すと、潜在的なセキュリティ上の問題が発生する可能性があります。ソース。また、system子プロセスが終了するのを待ちますが、親プロセスと同時に実行したい場合もあります。

より一般的には、低レベルの fork/exec を使用すると、追加の制御が可能になります。2 つの操作の前または間に、chdirパイプを開いたり、ファイル記述子を閉じたり、共有メモリを設定したりすることができます。

(異なるシステムとは、Windows と Unix を意味するものではありません (Windows には fork さえないため): Red Hat Linux と Ubuntu のことです。前者は に渡されたものを実行するために Bash を使用しsystem、後者は軽量の POSIX 互換シェル)。

于 2013-02-12T10:47:24.273 に答える
4

fork()新しいプロセスを作成します。それを行う必要がない場合は、system()(またはpopen()) を使用してください。並列処理を実現するため、またはジョブをよりきめ細かく制御するために 2 番目のプロセスが必要になる場合がありますが、ジョブが同期することを意図している場合は、多くの場合、それを気にしません。

一方、 の使用の 95%system()は不必要であるか、別の方法 (たとえば、 の代わりに zlib を使用system("gzip")) を使用した方がよいことがわかりました。したがって、おそらく最良の答えは、どちらも使用しないことです!

于 2013-02-12T10:47:42.750 に答える
1

さらに経由system()すると、シェルプロセスが呼び出されますが、これは望ましくない場合があります。

また、シェルによって実行された実際のプロセスが終了したときではなく、そのようなシェルが終了したときにのみ呼び出しプロセスに通知されます。

于 2013-02-12T10:47:38.230 に答える
-1

system() はコマンドを入力し、ユーザーが入力したように実行します。私は主にそれを次のように見ましたsystem("pause"); system("cls");

ただし、子プロセスを制御する必要がある場合は、フォークする必要があります。

于 2013-02-12T10:47:24.633 に答える