したがって、コマンドがシェルから起動されると、fork()はその子プロセスを継承し、exec()は子プロセスをメモリにロードして実行します。
そうでもない。 fork()
現在のプロセスを複製し、同一の子を作成します。 現在のプロセスにexec()
新しいプログラムをロードし、既存のプログラムを置き換えます。
私の質問:
子プロセスに親プロセス(元のプロセス)のすべての属性が含まれている場合、この子プロセスの必要性は何ですか?元のプロセスもメモリにロードされている可能性があります。
必要なのは、親プロセスがまだ終了したくないためです。新しいプロセスが実行され、同時に実行を継続すると同時に何かを実行することを望んでいます。
このフォークとexecの概念は、UNIXのすべての実行可能プログラムに適用されますか?シェルの組み込みコマンドにも適用されますか?
外部コマンドの場合、シェルはfork()
コマンドを新しいプロセスで実行するようにします。ビルトインはシェルによって直接実行されます。もう1つの注目すべきコマンドはexec
、exec()
最初にfork()
ing せずにシェルに外部プログラムに指示するコマンドです。これは、シェル自体が新しいプログラムに置き換えられるため、そのプログラムが終了時に戻るためにシェルが存在しないことを意味します。あなたが言う場合は、exec true
、その後、/bin/true
それが終了しますので、もうあなたの端末で実行して何も残さない、自分の殻を交換し、すぐに終了します。
コマンド/スクリプトを実行する場合、コピーオンライトのコンセプトが使用されますか?
石器時代に戻って、fork()
実際には呼び出しプロセスのすべてのメモリを新しいプロセスにコピーする必要がありました。コピーオンライトは、2つのプロセスが同じメモリの共有を開始するようにページテーブルが設定され、いずれかのプロセスによって書き込まれたページのみが必要なときにコピーされる最適化です。