FORK(2) |
FreeBSD System Calls Manual |
FORK(2) |
名称
fork —
新しいプロセスを作成する
ライブラリ
Standard C Library (libc, -lc)
書式
#include < unistd.h>
pid_t
fork( void);
解説
fork() システムコールは、新しいプロセスの生成を行います。新しいプロセス (子プロセス) は、次を除いて呼び出しているプロセス (親プロセス) の正確なコピーです:
- 子プロセスには、ユニークなプロセス ID があります。
- 子プロセスには、異なる親プロセス ID があります (すなわち、親プロセスのプロセス ID)。
- 子プロセスには、親の記述子のそれ自体のコピーがあります。これらの記述子は、同じ根本的なオブジェクトを参照します、つまりそれは、例えば、ファイルオブジェクトのファイルポインタが、子プロセスと親プロセスの間で共有され、その結果、子プロセスの記述子で lseek(2) することは、親プロセスでその後の read(2) または write(2) に影響するかもしれません。また、この記述子のコピーは、パイプをセットアップするのと同様に、新しく作成されたプロセスのための標準入力と出力を確立するためにシェルによって使用されます。
- 子プロセスのリソースの利用は、0 に設定されます。 setrlimit(2) を参照してください。
- すべてのインターバルタイマは、クリアされます。 setitimer(2). を参照してください。
- 子プロセスには、親プロセスで呼び出しているスレッドに対応する、ただ 1 つのスレッドがあります。プロセスに 2 つを以上のスレッドがあるなら、ロックされ、他のスレッドによって保持された他のリソースは、解放されません、したがって、非同期シグナルにセーフな関数 ( sigaction(2) を参照) だけが execve(2) または同様の関数を呼び出すまで子プロセスで動作することが保証されます。
戻り値
成功して完了すれば、
fork() は、子プロセスに 0 の値を返し、親プロセスに子プロセスのプロセス ID を返します。そうでなければ、-1 の値が親プロセスに返され、子プロセスは、作成されず、グローバル変数
errno は、エラーを示す値が設定されます。
エラー
fork() システムコールは、次の場合に失敗し、子プロセスは、作成されません:
-
[
EAGAIN]
-
実行に基づくプロセスの合計数のシステムの制限が超過しました。制限は、
sysctl(3) MIB 変数
KERN_MAXPROC によって与えられます。 (制限は、スーパユーザを除いて、この値未満の実際に 10 です)。
-
[
EAGAIN]
-
ユーザがスーパユーザでなく、シングルユーザによって実行に基づくプロセスの合計数でシステムの制限が超過しました。制限は、
sysctl(3) MIB 変数
KERN_MAXPROCPERUID によって与えられます。
-
[
EAGAIN]
-
ユーザがスーパユーザでなく、
resource 引数
RLIMIT_NPROC に対応するソフトリソース制限が超過しました (
getrlimit(2) を参照)。
-
[
ENOMEM]
-
新しいプロセスのための十分なスワップ領域がありません。
歴史
fork() 関数は、 Version 6 AT&T UNIX で登場しました。