FORK(2)

名称
fork - 新しいプロセスを作成する

ライブラリ
libc

書式
<sys/types.h> <unistd.h> pid_t fork(void)

解説
fork() システムコールによって新しいプロセスの作成が行われます。 新しいプロセス (子プロセス)は、 以下の項目を除いた呼び出しプロセス (親プロセス) の正確なコピーです。

•   子プロセスはユニークなプロセス ID を持ちます。

•   子プロセスは異なる親プロセス ID を持ちます (すなわち、親プロセスのプロセス ID です)。

•   子プロセスは、専用の、親の記述子のコピーを持ちます。 それらの記述子は下層の同じオブジェクトを参照します。 つまり子と親の間で、たとえばファイルオブジェクト内の ファイルポインタが共有されます。 そのため子プロセスの記述子への lseek(2) が、その後の親による read(2) または write(2) に影響を及ぼします。 この記述子コピーは、新しく作成されたプロセス用の標準入出力を確立するために、 およびパイプをセットアップするために、シェルによっても使用されます。

•   子プロセスのリソース使用状況は 0 に設定されます。 setrlimit(2) を参照してください。

•   すべてのインターバルタイマがクリアされます。 setitimer(2) を参照してください。

戻り値
正常に完了した場合、 fork() は、子プロセスに値 0 を返し、子プロセスのプロセス ID を親プロセスに返します。 そうでない場合は -1 が親プロセスに返され、子プロセスは作成されずに、 エラーを示すためにグローバル変数 errno が設定されます。

エラー
次の場合に fork() システムコールは処理に失敗し、子プロセスは作成されません:

[EAGAIN]
    実行中のプロセスの合計数がシステムの限界を超えます。 限界値は sysctl(3) の MIB 変数の KERN_MAXPROC によって指定されます (スーパユーザを除いて、 実際には限界はこれより 10 個少なくなります)。

[EAGAIN]
    ユーザがスーパユーザでなく、 1 人のユーザによって実行中のプロセスの合計数が、システムの限界を越えます。 限界は sysctl(3) の MIB 変数の KERN_MAXPROCPERUID によって指定されます。

[EAGAIN]
    ユーザがスーパユーザでなく、 resource 引数の RLIMIT_NPROC に対応するソフトリソース限界を越えます (getrlimit(2) を参照)。

[ENOMEM]
    新しいプロセス用のスワップ空間が不充分です。

関連項目
execve(2), rfork(2), setitimer(2), setrlimit(2), vfork(2), wait(2)

歴史
fork() 関数は AT&T UNIX で登場しました。