forkとexecパターンを使用して、現在のプログラムをフリーズせずにプログラムを実行する場合、たとえば、この1行を使用するよりも優れている点は何ですか。
system("program &"); // run in background, don't freeze
このsystem
関数は、プログラムを実行するための新しいシェルインスタンスを作成します。そのため、バックグラウンドで実行できます。fork
/との主な違いは、このようにexec
使用するsystem
と、実際にはシェルとプログラムの2つのプロセスが作成され、無名パイプを介して新しいプログラムと直接通信できないことです。
fork + execは、system()よりもはるかに軽量です。後者はシェルのプロセスを作成し、シェルは指定されたコマンドラインを解析し、必要な実行可能ファイルを呼び出します。これは、より多くのメモリ、より多くの実行時間などを意味します。明らかに、プログラムがバックグラウンドで実行される場合、これらの余分なリソースは一時的にのみ消費されますが、使用頻度によっては、違いがかなり顕著になります。
システムのマニュアルページにsystem
は、「/ bin / sh -cコマンドを呼び出す」ことでコマンドを実行することが明記されています。これは、システムが少なくとも2つのプロセスを作成することを意味します。/bin/sh
次にプログラム(シェル起動ファイルは複数のプロセスを生成する場合があります)
これにより、いくつかの問題が発生する可能性があります。
/bin/sh
、または&
バックグラウンドでプロセスを実行するために使用しない場合はどうなりますか?)これを行う適切な方法はfork
+で、これは正確にexec
1つのプロセスを作成します。これにより、パフォーマンスとリソース消費をより適切に制御でき、単純で重要なこと(エラー処理など)を実行するように変更するのがはるかに簡単になります。