子プロセスが作成された直後にexec()またはexit()を呼び出すときにvfork()を使用するのはなぜですか?

子プロセスが作成された直後にexec()またはexit()を呼び出すときにvfork()を使用するのはなぜですか?

オペレーティングシステムの概念とAPUE理論

vfork() を使用すると、親プロセスは一時停止され、子プロセスは親プロセスのアドレス空間を使用します。 vfork()は書き込み時にコピーを使用しないため、子プロセスが親プロセスのアドレス空間内のページを変更すると、親プロセスが再開されると、変更されたページが親プロセスに表示されます。だから、vfork() は、子プロセスが親プロセスのアドレス空間を変更しないように注意して使用する必要があります。

vfork()は、子プロセスが作成された直後にexec()またはexit()が呼び出されたときに使用されるように作成されました。

最後の文章をどのように理解する必要がありますか?

vfork()呼び出しによって子プロセスが作成されたら、新しいプログラムをロードして親プロセスのアドレス空間を変更しませexec()んか?exec()

vfork()生成された子プロセスを呼び出すと、exit()exit()プロセスが終了したときに親プロセスのアドレス空間が変更されませんか?

私は個人的にLinuxを好みます。

ありがとうございます。

ベストアンサー1

vfork()呼び出しによって子プロセスが作成されたら、新しいプログラムをロードして親プロセスのアドレス空間を変更しませexec()んか?exec()

いいえ、exec()新しいプログラムは新しいアドレス空間を提供し、親アドレス空間は変更されません。例を見るexecPOSIXの機能に関する議論Linuxexecve()のマンページ

vfork()によって生成された子プロセスが終了()を呼び出すと、終了()は子プロセスを終了したときに親プロセスのアドレス空間を変更しませんか?

簡単exit()です。実行中のプログラム(ライブラリを含む)によってインストールされたシャットダウンフックを実行します。vfork()したがって、Linuxではより制限的です。それは規定する何かの目的を指します。_exit()どのいいえCライブラリのクリーンアップ機能を呼び出します。

vfork()正しい理解が難しいことが判明し、現在のPOSIX標準バージョンでは削除されました。posix_spawn()使用すべき

しかし、あなたでなければ本物あなたが何をしているのかを知る必要があります。いいえvfork()またはposix_spawn();をfork()使用してくださいexec()

上記のリンクされたLinuxのマンページは、より多くのコンテキストを提供します。

しかし、以前はfork(2) 呼び出し元のデータスペースの完全なコピーが必要でしたが、通常はexec(3)anの直後に行われたため、不要でした。したがって、効率を向上させるために、BSDは、親vfork() プロセスのアドレス空間を完全にコピーせずに呼び出しが発生または終了するまで、親プロセスのメモリと制御スレッドを借りるシステムコールを導入しましたexecve(2)。子プロセスがそのリソースを使用している間、親プロセスは一時停止します。の使用は vfork()難しいです。たとえば、親プロセスでデータを変更しないことは、レジスタにどの変数があるかを知ることに依存します。

おすすめ記事