VFORK(2)

名称
vfork - 効率的な方法で仮想メモリに新しいプロセスを生成

ライブラリ
libc

書式
<unistd.h> int vfork(void)

解説
vfork() では、古いプロセスのアドレス空間を完全にコピーせずに、 新しいプロセスを作成できます。 ページングする環境では、古いプロセスのアドレス空間を完全にコピーすることは、 非常に非効率的です。 fork(2) する目的が、 execve(2) のための新しいシステムコンテキストの作成である場合に有効です。 vfork() は、 execve(2) を呼び出すか、終了する ( _exit(2) を呼び出すか異常終了する) まで子が親のメモリとコントロールの スレッドを借りるという点で、 fork(2) と異なります。親プロセスは、子がリソースを使用している間停止されます。

vfork() は、0 を子のコンテキストに、そして (後に) 子の pid を 親のコンテキストに戻します。

通常の場合、 vfork() は fork(2) のように使用できます。しかし、 vfork() を呼び出したプロシージャから子のコンテキストで動作している間に 動作して戻ることはありません。最終的に vfork() から戻ると、存在しないスタックフレームに戻るからです。 execve(2) を実行できない場合は、 exit(3) ではなく、 _exit(2) を呼び出してください。 exit(3) は標準入出力チャネルをフラッシュして閉じるため、 親プロセスの標準入出力データ構造体を壊してしまいます。( fork(2) でも、バッファに入っているデータが 2 回フラッシュされるので、 exit(3) を呼び出さないでください。)

関連項目
execve(2), fork(2), rfork(2), sigvec(2), wait(2), _exit(2), exit(3)

戻り値
fork(2) と同じです。

バグ
このシステムコールは、適切なシステム共有メカニズム が実現したときに削除されます。削除された場合は、 fork(2) と同義になるので、 vfork(2) のメモリ共有の現実装には依存しないでください。

デッドロックを避けるため、 vfork() の途中で子になるプロセスには、 SIGTTOU シグナルや SIGTTIN シグナルが送信されません。その代わりに出力、または、 ioctl(2) 呼び出しが許可され、入力しようとすると EOF となります。

歴史
vfork() 関数呼び出しは、 2.9BSD で登場しました。