HP C for OpenVMS システムの用意している
vfork関数は,他の C の実装の
fork関数とは異なります。 表 1-12 に,両者の間の主な違い 2 つを示します。
表 1-12 vfork 関数と fork 関数
exec
関数とともに使用される。
|
非同期処理で,
exec
関数なしで使用できる。
|
親プロセスの一部の特性を共用する独立した子プロセスを作成する。
|
vfork
が呼び出されたポイントで分岐する,親プロセスの正確な複製を作成する。親と子は,異なる実行段階にある同じプロセスであるかのように振る舞う。
|
vfork関数は,それ以降の
exec関数の呼び出しのために必要なセットアップを行います。
vforkはプロセスは作成しませんが,以下のステップを実行します。
- 後に
exec関数の呼び出しのリターン・アドレスとして使用されるリターン・アドレス (
vfork呼び出しのアドレス ) を保存する。
- 現在のコンテキストを保存する。
- 初めて呼び出されたとき (
exec関数の呼び出しの前) には整数 0 を返す。対応する
exec関数呼び出しが行われた後は,
exec関数は
vfork呼び出しのポイントで親プロセスに制御を返し,戻り値として子プロセスのプロセス ID を返す。
exec関数が実行に失敗しない限り,呼び出しが
vfork関数に対して 1 回,
exec関数に対して 1 回行われたにもかかわらず,制御は
vforkから 2 回返ったように見える。
vfork関数の動作は,
setjmp関数の動作に似ています。
vforkと
setjmpは,どちらも後に使用されるリターン・アドレスを設定し,このアドレスをセットアップするために初めて呼び出されたときには整数 0 を返し,第 2 の戻り値を,対応する
execまたは
longjmp関数呼び出しからではなく,自分で返したような形で返します。
しかし,
setjmpとは違って
vforkでは, volatile で修飾されたものも含むすべてのローカルな自動変数が,
vforkの呼び出しとそれに対応する
execルーチンの呼び出しの間で変更された場合には,不定の値を持つ可能性があります。