-1

Unixのフォークについてはすでにどこでも検索しましたが、まだ何かを理解していません。たとえば、シェル (bash) でコマンド ('ls' としましょう) を実行する場合、fork() システム コールを呼び出していますか? 「ls」が子​​で、現在のシェルが親ですか?

私が読んだ本の中で、「現在実行中のプログラムをコピーして実行中のプログラムの正確なコピーである子を作成すると、フォークが生成される」と正確に述べています。これはどういう意味ですか?bashの正確なコピー?ps -ef を実行すると、PID と PPID(親) を確認して理解できます。しかし、なぜ本はそれを教えているのですか?正確なコピーは同じプログラム (プログラムの同じプロセス) ではありませんか?

そして、私は exec() システムコールを理解することができます.... 誰か兄弟を助けてください.... ありがとう

4

1 に答える 1

1

1 つの CPU が複数のプロセスを実行できることを理解していますよね? そこから、これらのプロセスのうち 2 つが同一である可能性があると想像するのは簡単なことではありません。つまり、まったく同じコードを実行し、同じリソースを共有するということです。これは基本的に、 fork() システム コールが呼び出されたときに発生することです。

fork() システム コールは、既存のプロセスからさらに多くのプロセスを生成するための最初のステップとなるプリミティブとして設計されました。fork() 呼び出しは基本的に、現在のプロセスを表すカーネル内のデータ構造のコピーを作成し、その実行を開始します。新しいプロセスは、(exec() システム コールを使用して) まったく別のプログラムのコードをオーバーレイし、代わりにそれを実行できます。

別のプロセスを作成する必要があるプロセスは、最初に fork() を呼び出して自身のコピーを作成する必要があります。次に、コピーは他のプログラムを実行します。Bash は、「ls」や「cp」などの別のプログラムを実行する必要があるたびに、これを行う必要があります。forks() すると、コピー処理が進み、ターゲット プログラムが実行されます。

于 2013-09-12T17:14:15.793 に答える