スポンサーリンク

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

スポンサーリンク