次のようなLinuxbashスクリプトの場合:
exec /usr/lib/4.5/mono-service.exe ./AudioVideoRecorder.exe "$@"
、なぜ私はexec
コマンドを実行する必要があり、exec
パーツなしで実行するだけではないのですか?
簡単に言うと、そうではありませんが、CPU時間を約1ミリ秒節約できます(最新のCPUの場合)。(exec
スクリプトの最後でのみ実行する必要があることに注意してくださいexec
。これ以降は実行されないためです)。
より長い答えは次のとおりです。 Exec
現在のプロセスのプロセスイメージを、実行する実行可能ファイルのプロセスイメージに置き換えます。つまり、実行した瞬間に、exec
ingを実行するシェルプロセスが完全に破棄され、exec
edプログラムに置き換えられます。そうしないexec
と、シェルはそれ自体をフォークし、フォーク内で実行し、子プロセスが終了するのを待って、その戻りステータスを収集します。後で実行する追加のコマンドがあることを期待します(fork
+exec
は標準の手順です。新しいコマンドが生成されます)。何もないので、これfork
は完全に時間の無駄であり、直接実行してそのfork
時間を節約することもできます。
ほとんどの目的と目的では、プロセスがUnicesでどのように生成されるかに関する知識に基づいた、本質的にはマイクロ最適化です。
注:(ilkkachuのおかげで)わずかなセマンティックの違いが生じるのは、スクリプトを生成するプロセスが、実行された可能性のあるプログラムがどのように終了するかを気にするかどうかです。実行された可能性のある子が正常に終了する場合、シェルスクリプトは最後に待機した終了ステータスを独自の終了ステータスに転送するため、実行形式と非実行形式は同等です。ただし、子がシグナルn
で死亡した場合、シェルはそれを終了ステータスに変換し128+n
、シグナルされた情報を事実上失います。(子が終了コードで定期的に終了しないことが確実な場合、情報は失われません>128
、これは通常の場合です。)execを実行すると、ミドルマンシェルはなくなり、終了ステータス情報は実行スクリプトの呼び出し元に直接送信されます(また、子をマージするミドルマンシェルがないため、子が終了したか通知されたかに関する情報は保持されます。終了コード)。(詳細については、waitpid(2)を参照してください)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加