VFORK(2) FreeBSD システムコールマニュアル VFORK(2)
名称
vfork − 効率的な方法で仮想メモリに新しいプロセスを生成 |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <unistd.h> pid_t |
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), _exit(2), fork(2), rfork(2), sigvec(2), wait(2), exit(3) |
戻り値
fork(2) と同じです。 |
バグ
このシステムコールは、適切なシステム共有メカニズムが実現したときに削除さ れます。削除された場合は、 fork(2) と同義になるので、 vfork() のメモリ共 有の現実装には依存しないでください。 デッドロックを避けるため、 vfork() の途中で子になるプロセスには、 SIGTTOU シグナルや SIGTTIN シグナルが送信されません。その代わりに出力、または、 ioctl(2) 呼び出しが許可され、入力しようとすると EOF となります。 |
歴史
vfork() システムコールは、 2.9BSD で登場しました。 FreeBSD 10.0 June 4, 1993 FreeBSD 10.0 |