プロセスがフォークし、フォークされた息子が execv を呼び出した後、結果は依然として父親の息子ですか?
4 に答える
fork は、PARENT の CHILD と呼ばれる新しいプロセスを作成します...exec は、現在実行中のプログラムを exec されたプロセスに置き換えます。したがって、PARENT の CHILD プロセスのままです...
はい。execv は新しいプロセスを作成しません。そのため、最初に fork する必要があります。
はい、そうです。また、「プロセス ファミリー」という用語は、非常に重要な概念である「プロセス グループ」に不快なほど近いものです。
あなたは正しい軌道に乗っています。基本的に、古い UNIX のfork(2)システム コールは、新しい PID と新しいプロセス スタックを使用して、fork したプロセスのコピーを作成し、それを実行するためにメモリ空間をコピーしました。execは、既存のプロセスに新しいイメージをロードします。ほとんどのシェルの操作で、その 1 つのバージョンを確認できますexec
。これは、シェルが占めていたプロセスで目的のイメージを uns します。
プロセスを fork すると、 fork システム コールは、親の場合は新しいプロセスの PID を返し、子の場合は 0 を返しました。子プロセスは、開いているすべてのファイル記述子、特に 0、1、および 2 も継承します。これらは、より一般的には STDIN、STDOUT、および STDERR として知られています。
(簡単なクイズ: シェルがリダイレクトをどのように管理していると思います>
か?)
より大きなアドレス空間を備えた最新の UNIX バリアント (元の UNIX は合計 64K ワードしかありませんでした!)は、実行を開始するために必要なプロセスのサブセットのみをコピーし、必要に応じて残りを取得するためにメモリ マネージャーに依存するvforkと呼ばれるバリアント フォークを実装します。 . ほとんどの場合、fork の直後に exec が続き、新しいイメージをロードする必要があるため、これは重要な最適化です。
マッハはそれをさらに一歩進めます。新しい pprocess を作成すると、実行コンテキストに必要なもの以外は何もコピーされません。イメージはまったく同じです。コピーは、プロセスがメモリ内の場所を変更したときにのみ発生し、その場所を含むページがコピーされます。これは「コピー オン ライト」と呼ばれ、ほぼ最適です。