vfork(2) FreeBSD 一般コマンドマニュアル

vfork

前のページ 上に戻る 次のページ

vfork




書式

     #include <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 で登場しました。

FreeBSD 4.4                      June 4, 1993                      FreeBSD 4.4

ABELNET VPSサービス