2

forkとexecパターンを使用して、現在のプログラムをフリーズせずにプログラムを実行する場合、たとえば、この1行を使用するよりも優れている点は何ですか。

system("program &"); // run in background, don't freeze
4

3 に答える 3

5

このsystem関数は、プログラムを実行するための新しいシェルインスタンスを作成します。そのため、バックグラウンドで実行できます。fork/との主な違いは、このようにexec使用するsystemと、実際にはシェルとプログラムの2つのプロセスが作成され、無名パイプを介して新しいプログラムと直接通信できないことです。

于 2012-12-18T16:37:10.270 に答える
1

fork + execは、system()よりもはるかに軽量です。後者はシェルのプロセスを作成し、シェルは指定されたコマンドラインを解析し、必要な実行可能ファイルを呼び出します。これは、より多くのメモリ、より多くの実行時間などを意味します。明らかに、プログラムがバックグラウンドで実行される場合、これらの余分なリソースは一時的にのみ消費されますが、使用頻度によっては、違いがかなり顕著になります。

于 2012-12-18T16:43:51.413 に答える
1

システムのマニュアルページにsystemは、「/ bin / sh -cコマンドを呼び出す」ことでコマンドを実行することが明記されています。これは、システムが少なくとも2つのプロセスを作成することを意味します。/bin/sh次にプログラム(シェル起動ファイルは複数のプロセスを生成する場合があります)

これにより、いくつかの問題が発生する可能性があります。

  • 移植性(システムがアクセスできない場合/bin/sh、または&バックグラウンドでプロセスを実行するために使用しない場合はどうなりますか?)
  • エラー処理(プロセスがエラーで終了したかどうかはわかりません)
  • プロセスと話している(プロセスに何も送信したり、プロセスから何かを取得したりすることはできません)
  • パフォーマンスなど

これを行う適切な方法はfork+で、これは正確にexec1つのプロセスを作成します。これにより、パフォーマンスとリソース消費をより適切に制御でき、単純で重要なこと(エラー処理など)を実行するように変更するのがはるかに簡単になります。

于 2012-12-18T16:47:22.993 に答える