VFORK(2) — UNIX Programmer’s Manual
名称
vfork − 仮想メモリにとって効率的な方法で新しいプロセスを作る
形式
pid = vfork()
int pid;
解説
vfork は、 古いプロセスのアドレススペースを 完全にコピーせずに新しいプロセスを 作成するために使用することができます。 古いプロセスのアドレススペースの完全コピーは、 仮想ページ環境では、 非常に非効率的だからです。 このコールは、 fork(2) の目的が execve のための新しいシステムコンテクストの作成にあるような場合に有用です。 vfork は、 execve(2) へのコールがあるまで、 または終了 (exit(2) へのコールによる終了と異常終了)するまで、 子プロセスが親のメモリと制御の手続きを 借りる点で、 fork とは違います。 親プロセスは、 子がそのリソースを使用している間はサスペンドされています。
vfork は、 子のコンテクストに 0 を 返し、 (あとで)その親のコンテクストにその子のプロセスIDを 返します。
vfork は、 通常、 fork とまったく同様に使用することができます。 しかし、 vfork を呼び出したプロシージャの子のコンテクストで稼働している間に リターンする働きはありません。 なぜなら、 vfork からこのようなリターンがあると、 現存のスタックフレームへのリターンがなってしまうからです。 また、 execve を 実行することができない場合には、 exit ではなく _exit を 呼び出すようにしてください。 なぜなら、 exit は、 標準入出力チャンネルを フラッシュしてクローズし、 親プロセスの標準入出力データ構造体を 混乱させてしまうからです。 (fork を 使用する場合であっても、 exit を 呼び出すのは間違いです。 これを 行うと、 バッファされているデータが 2度フラッシュされるからです。)
関連事項
fork(2), execve(2), sigvec(2), wait(2),
診断
fork の場合と同様です。
バグ
このシステムコールは、 適当なシステムシェアリングメカニズムが実現されれば削除されるでしょう。 ユーザは vfork のメモリシェアリングに依存すべきではありません。 そうした場合には、 fork と変わりなくなります。
デッドロックの発生を 防止するためには、 vfork の途中で子となっているプロセスへ、 SIGTTOU または SIGTTIN シグナルが送られないようにします。 しかし、 出力または ioctl は許されます。 また、 入力を 行おうとすると end-of-file が示されます。
NEWS-OSRelease 3.3