質問 2 に対する簡単な答えは次のとおりfork
です。絶対に使用しないでくださいvfork
。
質問 1 で何を尋ねているのか正確にはわかりませんvfork
。ed プロセスは 2 つのシステム コールしか使用できません:_exit
とexecve
. (実際には、exec
ファミリーのいずれかを使用できますexecve
が、最も一般的なものです。) これらのいずれかを実行すると、デッド ( _exit
) またはもはやvfork
( exec*
) ではなくなり、親はブロックされなくなります。したがって、子が新しい記憶イメージを取得すると、子と親は共存できます。
通常の場合、子は を呼び出そうとしexecve
ますが、失敗しない限り戻りません。その後すぐに を呼び出します。_exit
これは、 が失敗した場合にのみ発生しexecve
ます。
子は、子プロセスを適切に設定するためにしばしば必要となるdup
またはを呼び出すことができません。close
メモリを変更することはできません (メモリは親に属しているため)。そのため、ほとんど役に立ちません。
むかしむかし、プロセスの作成は遅かったです。最近では、はるかに高速であり、ほとんどの UNIX ライクな OS (Linux や FreeBSD を含む) は「コピー オン ライト」を使用しています。 . したがって、課せられた制限と提供される安全性の欠如vfork
は、もはや役に立ちません。
vfork
は 2008 年版で Posix から削除されたため、非推奨と見なす必要があります。
fork
それがパフォーマンスの問題であることが本当にわかった場合posix_spawn
は、システムで使用できる場合は、使用を検討する必要があります。(私の知る限り、Linux の最近のバージョンで利用でき、FreeBSD と Solaris でかなり長い間利用できます。) 実際には を呼び出す可能性がありますvfork
が、未定義の動作を引き起こすことなく、少なくとも詳細を処理します。