VFORK(2) | FreeBSD System Calls Manual | VFORK(2) |
名称
vfork — アドレス空間をコピーせずに新しいプロセスを作成するライブラリ
Standard C Library (libc, -lc)解説
ページングされる環境において恐ろしく非能率的である、古いプロセスのアドレス空間を完全にコピーせずに、新しいプロセスを作成するために vfork() システムコールを使用することができます。 fork(2) の目的が execve(2) のための新システムコンテキストを作成することだったとき、役に立ちます。 vfork() システムコールは、 execve(2) を呼び出すか、または終了するまで、 ( _exit(2) への呼び出しか、または異常終了のいずれかによって) 子プロセスが、親プロセスのメモリと制御スレッドを借りる点において、 fork(2) と異なります。親プロセスは、子プロセスが、そのリソースを使用している間、サスペンドされます。vfork() システムコールは、子プロセスのコンテキストに、0 を返し、(その後) 親プロセスのコンテキストに子プロセスの pid を返します。
通常、 vfork() システムコールを、 fork(2) のように使用することができます。しかしながら、次に vfork() からの最終的な返りは、はもはや存在しないスタックフレームに返るので、 vfork() を呼び出した手続きから子プロセスのコンテキストで実行する間に返ると、動作しません。また、 execve(2) を呼び出すことができないなら、 exit(3) は、標準 I/O チャネルをフラッシュして、クローズし、それによって、親プロセスの標準 I/O データ構造を壊してしまうので、 exit(3) ではなく _exit(2) を呼び出すことに注意してください。 ( fork(2) と同様に、バッファリングされたデータは、次に 2 度フラッシュされるので、 exit(3) を呼び出すことは間違いです。)
戻り値
fork(2) と同様です。歴史
vfork() システムコールは、 2.9BSD で登場しました。バグ
起こり得るデッドロックの状況を回避するために、 vfork() の途中で子どもであるプロセスは、決して SIGTTOU または SIGTTIN シグナルを送信しません。それどころか、出力または ioctl(2) 呼び出しは、許可され、入力の試みは、エンドオブファイル (end-of-file) 表示の結果となります。November 13, 2009 | FreeBSD |