vforkのヘルプ・マニュアル
日本語 英語
vfork --help
man vfork
VFORK(2) Linux Programmer’s Manual VFORK(2)
名前
vfork - 子プロセスを生成し親プロセスを停止させる
書式
#include
#include
pid_t vfork(void);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
vfork(): _BSD_SOURCE || _XOPEN_SOURCE >= 500
説明
規格の説明
(POSIX.1 より引用) vfork() 関数は fork(2) と同じ働きをするが、 vfork()
で作成されたプロセスが vfork() からの返り値を格納している pid_t 型の 変
数 以 外を変更したり、 vfork() を呼び出している関数から return したり、
_exit(2) や exec(3) 族の関数をコールする前に他の関数をコールした場合 の
動作が未定義であるという点が異なる。
LINUX での説明
vfork() は fork(2) と全く同じように呼び出したプロセスの子プロセスを生成
する。詳しい説明と返り値、エラーについては fork(2) を参照すること。
vfork() は clone(2) の特殊な場合である。親プロセスのページテーブルの コ
ピ ーを行わずに新しいプロセスを作成するために使用する。これは性能に敏感
なアプリケーションにおいて子プロセスを生成してすぐに execve(2) する場合
に有用かもしれない。
vfork() は fork(2) と違い、子プロセスが終了するか、 execve(2) をコール
するまで親プロセスを停止 (suspend) させる。子プロセスの終了は、 exit(2)
の 呼び出しによる通常終了、致命的なシグナルの配送後の異常終了の二つのケ
ースがある。この時点までは、子プロセスはスタックを含む全てのメモリを 親
プ ロ セ スと共有する。子プロセスは現在の関数から return してはならず、
exit(3) もコールしてはならないが、 _exit(2) ならばコールしてもよい。
シグナルハンドラは継承されるが、共有はされない。親プロセスへのシグナ ル
は 、子プロセスが親プロセスのメモリを解放した後 (すなわち、子プロセスが
終了するか execve(2) を呼んだ後) に到着する。
歴史的な説明
Linux において fork(2) は書き込み時コピー (copy-on-write) ページを使 用
して実装されている。そのため fork(2) を使用することによって被る損害は親
プロセスのページ・テーブルを複製するために必要な時間とメモリだけであ る
。しかしながら、忌しき昔には fork(2) は呼び出したプロセスのデータ空間の
全てのコピーしていたが、これはしばしば不必要であった。なぜなら、たい て
いはすぐ後に exec(3) を実行していたからである。この場合の効率を上げるた
めに BSD は vfork() システムコールを導入して親プロセスのアドレス空間 を
完全にコピーするかわりに、 execve(2) をコールするか exit が起きるまで親
プロセスのメモリと制御スレッドを借りるようにした。親プロセスは子プロ セ
スがその資源を使用している間は停止された。 vfork() は使いにくいものであ
った: 例えば、親プロセスの変数を変更しないようにするためにはどの変数 が
レジスタに保持されているかを知らなければならなかった。
準拠
4.3BSD, POSIX.1-2001. POSIX.1-2008 では、 vfork() の規定が削除されてい
る。 vfork() コールは他のオペレーティング・システムの同名のコールとちょ
っと似ているかもしれない。規格が vfork() に要求していることは、 fork(2)
に要求していることよりは弱い。したがって、両者を同じものとして実装し て
も 、規格に準拠していることになる。特にプログラマーは、子プロセスが終了
するか execve(2) を呼び出すまで親プロセスが停止していることや、メモリを
共有することによる特殊な動作をあてにすべきではない。
注意
Linux での注意
pthread_atfork(3) を使って設定された fork ハンドラは NPTL スレッドライ
ブラリコールを採用したマルチスレッドプログラムでは呼び出されない。一 方
、LinuxThreads スレッドライブラリを使ったプログラムでは、fork ハンドラ
は呼び出される。 (Linux のスレッドライブラリの説明は pthreads(7) を参照
。)
歴史
vfork() システムコールは 3.0BSD に現われた。 4.4BSD において fork(2) の
同 義 語 と な っ た が 、NetBSD で は 再 び 導 入 さ れ た 。
http://www.netbsd.org/Documentation/kernel/vfork.html を参照。 Linux で
は 2.2.0-pre6 あたりまでは fork(2) と等 価 で あ っ た 。(i386 で は)
2.2.0-pre9 から (他のアーキテクチャでは少し遅れて) 独立したシステムコー
ルとなった。 glibc でのサポートは glibc-2.0.112 で追加された。
バグ
Linux がこの過去の亡霊を復活させたことは、むしろ不幸と言うべきである 。
BSD のマニュアルには、「このシステムコールは妥当なシステム共有機構が実
装された場合には削除される。ユーザは vfork() のメモリ共有機能に依存する
べ きではない。何故ならば、このシステムコールが削除された場合には、それ
は fork(2) の同義語とされるからである。」と書かれている。
シグナルの扱いの詳細は不明瞭でシステムごとに異っている。 BSD のマニュア
ルには、「デッドロック状態になる可能性があるので vfork() の途中の子プロ
セスに SIGTTOU や SIGTTIN シグナルを送信してはならない; さらに 出 力 や
ioctl は許されるが、入力を試みた場合には結果はファイル終端 (EOF) になる
。」と書かれている。
関連項目
clone(2), execve(2), fork(2), unshare(2), wait(2)
Linux 2008-10-30 VFORK(2)
VFORK(2) Linux Programmer’s Manual VFORK(2)
NAME
vfork - create a child process and block parent
SYNOPSIS
#include
#include
pid_t vfork(void);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
vfork(): _BSD_SOURCE || _XOPEN_SOURCE >= 500
DESCRIPTION
Standard Description
(From POSIX.1) The vfork() function has the same effect as fork(2),
except that the behavior is undefined if the process created by vfork()
either modifies any data other than a variable of type pid_t used to
store the return value from vfork(), or returns from the function in
which vfork() was called, or calls any other function before success-
fully calling _exit(2) or one of the exec(3) family of functions.
Linux Description
vfork(), just like fork(2), creates a child process of the calling pro-
cess. For details and return value and errors, see fork(2).
vfork() is a special case of clone(2). It is used to create new pro-
cesses without copying the page tables of the parent process. It may
be useful in performance-sensitive applications where a child will be
created which then immediately issues an execve(2).
vfork() differs from fork(2) in that the parent is suspended until the
child terminates (either normally, by calling _exit(2), or abnormally,
after delivery of a fatal signal), or it makes a call to execve(2).
Until that point, the child shares all memory with its parent, includ-
ing the stack. The child must not return from the current function or
call exit(3), but may call _exit(2).
Signal handlers are inherited, but not shared. Signals to the parent
arrive after the child releases the parent’s memory (i.e., after the
child terminates or calls execve(2)).
Historic Description
Under Linux, fork(2) is implemented using copy-on-write pages, so the
only penalty incurred by fork(2) is the time and memory required to
duplicate the parent’s page tables, and to create a unique task struc-
ture for the child. However, in the bad old days a fork(2) would
require making a complete copy of the caller’s data space, often need-
lessly, since usually immediately afterwards an exec(3) is done. Thus,
for greater efficiency, BSD introduced the vfork() system call, which
did not fully copy the address space of the parent process, but bor-
rowed the parent’s memory and thread of control until a call to
execve(2) or an exit occurred. The parent process was suspended while
the child was using its resources. The use of vfork() was tricky: for
example, not modifying data in the parent process depended on knowing
which variables are held in a register.
CONFORMING TO
4.3BSD, POSIX.1-2001. POSIX.1-2008 removes the specification of
vfork(). The requirements put on vfork() by the standards are weaker
than those put on fork(2), so an implementation where the two are syn-
onymous is compliant. In particular, the programmer cannot rely on the
parent remaining blocked until the child either terminates or calls
execve(2), and cannot rely on any specific behavior with respect to
shared memory.
NOTES
Linux Notes
Fork handlers established using pthread_atfork(3) are not called when a
multithreaded program employing the NPTL threading library calls
vfork(). Fork handlers are called in this case in a program using the
LinuxThreads threading library. (See pthreads(7) for a description of
Linux threading libraries.)
History
The vfork() system call appeared in 3.0BSD. In 4.4BSD it was made syn-
onymous to fork(2) but NetBSD introduced it again, cf.
http://www.netbsd.org/Documentation/kernel/vfork.html . In Linux, it
has been equivalent to fork(2) until 2.2.0-pre6 or so. Since
2.2.0-pre9 (on i386, somewhat later on other architectures) it is an
independent system call. Support was added in glibc 2.0.112.
BUGS
It is rather unfortunate that Linux revived this specter from the past.
The BSD man page states: "This system call will be eliminated when
proper system sharing mechanisms are implemented. Users should not
depend on the memory sharing semantics of vfork() as it will, in that
case, be made synonymous to fork(2)."
Details of the signal handling are obscure and differ between systems.
The BSD man page states: "To avoid a possible deadlock situation, pro-
cesses that are children in the middle of a vfork() are never sent
SIGTTOU or SIGTTIN signals; rather, output or ioctls are allowed and
input attempts result in an end-of-file indication."
SEE ALSO
clone(2), execve(2), fork(2), unshare(2), wait(2)
COLOPHON
This page is part of release 3.22 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
Linux 2009-06-21 VFORK(2)