2017-11-30 10 views

答えて

1

execvが真vforkを次の、それはforkの作業の一部を行います。それはそれに新しいプログラムイメージとコピーの環境変数のような継承可能なものをロードするに新しいメモリ空間を割り当てます。一方、vforkでも、親の状態のビットを側に保存するので、子が分離されると、execvは親のスタックと命令ポインタを復元できます。

例えば、vforkは、_do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, ...)で共通のプロセスコピーコードを呼び出します。 copy_mmCLONE_VMに反応し、dup_mmを呼び出さずにメモリスペースを再利用するだけです。一方、_do_forkCLONE_VFORKに反応し、子をvfork_doneとマークし、メモリスペースが使用されなくなるまで呼び出し元を中断します。これがexecve経由の場合は、exec_mmapmm_releaseとなり、vfork_doneと表示され、親を起こします。

実際にはexecve(これもまたcopy_stringsを呼び出します)は常に「新しいメモリ空間を割り当てて環境変数をコピーします」。しかし、通常のforkの後には、これは、forkによって作成された非共有空間を解放するのと同時に発生するため、観測できません。

+0

Hmm ,.スジは通ってるようだ。あなたはいくつかのドキュメントやリファレンスを提供できますか? – matrixisreal

+1

@matrixisreal:私はこの件に関する実際の文書を見つけることができませんでしたが、最終的には、ソースを掘り下げる時間を見つけました。 –

関連する問題