Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all 

名前
fork - 子プロセスを生成する
書式
#include <unistd.h>
pid_t fork(void);
説明
fork() は呼び出し元プロセスを複製して新しいプロセスを生成する。 child で参照される新しいプロセスは、以下
の点を除き、 parent で参照される呼び出し元プロセスの完全な複製である:
* 子プロセスは独自のプロセス ID を持ち、 この PID は既存のどのプロセスグループ (setpgid(2)) の ID とも
一致しない。
* 子プロセスの親プロセス ID は、親プロセスのプロセス ID と同じである。
* 子プロセスは親プロセスのメモリーロック (mlock(2), mlockall(2)) を引き継がない。
* プロセスの資源利用量 (getrusage(2)) と CPU タイムカウンター (times(2)) が、子プロセスでは 0 にリセッ
トされる。
* 子プロセスの処理待ちのシグナルの集合 (sigpending(2)) は、初期状態では空になる。
* 子プロセスは親プロセスからセマフォ調整 (semop(2)) を引き継がない。
* 子プロセスは親プロセスからプロセスに関連付けられたレコードロックを引き継がない (fcntl(2))。 (一方、子
プロセスは親プロセスから fcntl(2) オープンファイル記述ロックと flock(2) ロックを引き継ぐ。)
* 子プロセスは親プロセスからタイマー (setitimer(2), alarm(2), timer_create(2)) を引き継がない。
* 子プロセスは親プロセスから主だった非同期 I/O 操作を引き継がない (aio_read(3), aio_write(3) 参照)。 ま
た、親プロセスから非同期 I/O コンテキストを引き継がない (io_setup(2) 参照)。
上記のリストにあるプロセス属性は、POSIX.1-2001 で全て指定されている。 親プロセスと子プロセスは、以下の
Linux 固有のプロセス属性も異なる:
* 子プロセスは親プロセスからディレクトリ変更通知 (dnotify) (fcntl(2) における F_NOTIFY の説明を参照)
を引き継がない。
* prctl(2) の PR_SET_PDEATHSIG の設定がリセットされ、子プロセスは親プロセスが終了したときに シグナルを
受信しない。
* timer slack value のデフォルト値には、親プロセスの現在の timer slack value が設定される。 prctl(2) の
PR_SET_TIMERSLACK の説明を参照。
* madvise(2) の MADV_DONTFORK フラグでマークされたメモリーマッピングは、 fork() によって引き継がれな
い。
* 子プロセスの終了シグナルは常に SIGCHLD である (clone(2) を参照)。
* ioperm(2) で設定されるポートアクセス許可ビットは、子プロセスには継承されない。子プロセスでは、
ioperm(2) を使って必要なビットをセットしなければならない。
以下の点についても注意すること:
* 子プロセスはシングルスレッドで生成される。つまり、 fork() を呼び出したスレッドとなる。 親プロセスの仮
想アドレス空間全体が子プロセスに複製される。 これにはミューテックス (mutex) の状態・条件変数・ pthread
オブジェクトが含まれる。 これが引き起こす問題を扱うには、 pthread_atfork(3) を使うと良いだろう。
* 子プロセスは親プロセスが持つ オープンファイルディスクリプターの集合のコピーを引き継ぐ。 子プロセスの各
ファイルディスクリプターは、 親プロセスのファイルディスクリプターに対応する 同じオープンファイル記述
(file description) を参照する (open(2) を参照)。 これは 2 つのディスクリプターが、ファイル状態フラグ・
現在のファイルオフセット、シグナル駆動 (signal-driven) I/O 属性 (fcntl(2) における F_SETOWN, F_SETSIG
の説明を参照) を共有することを意味する。
* 子プロセスは親プロセスが持つオープンメッセージキューディスクリプター (mq_overview(7) を参照) の集合の
コピーを引き継ぐ。 子プロセスの各ディスクリプターは、 親プロセスのディスクリプターに対応する 同じオー
プンメッセージキューディスクリプターを参照する。 これは 2 つのディスクリプターが同じフラグ (mq_flags)
を共有することを意味する。
* 子プロセスは、親プロセスのオープン済みのディレクトリストリームの集合 (opendir(3) 参照) のコピーを継承
する。 POSIX.1-2001 では、親プロセスと子プロセス間の対応するディレクトリストリーム はディレクトリスト
リームの位置 (positioning) を共有してもよいとされている。 Linux/glibc ではディレクトリストリームの位置
の共有は行われていない。
返り値
成功した場合、親プロセスには子プロセスの PID が返され、 子プロセスには 0 が返される。 失敗した場合、親プ
ロセスに -1 が返され、子プロセスは生成されず、 errno が適切に設定される。
エラー
EAGAIN 親プロセスのページテーブルのコピーと 子プロセスのタスク構造に生成に必要なメモリーを fork() が割り
当てることができなかった。
EAGAIN
システムで設定されたスレッド数の上限に達していた。 このエラーの原因となる上限値はいくつかある。 実
ユーザー ID 当たりのプロセス数とスレッド数の上限である、ソフトリソース上限 RLIMIT_NPROC に達してい
た (setrlimit(2) で設定できる)。 カーネルのシステム全体のプロセスとスレッドの上限数である
/proc/sys/kernel/threads-max が達していた (proc(5) 参照)。 PID の最大値 /proc/sys/kernel/pid_max
に達していた (proc(5) 参照)。
EAGAIN 呼び出し元は、スケジューリングポリシー SCHED_DEADLINE で動作しており、かつ reset-on-fork フラグが
セットされていない。 sched(7) 参照。
ENOMEM メモリーが足りないために、 fork() は必要なカーネル構造体を割り当てることができなかった。
ENOSYS fork() はこのプラットフォームではサポートされていない (例えば、メモリー管理ユニット (MMU) がない
ハードウェア)。
準拠
SVr4, 4.3BSD, POSIX.1-2001.
注意
Linux では、 fork() を 書き込み時コピー (copy-on-write) ページを用いて実装している。 したがって、fork を
行うことの唯一のデメリットは、 親プロセスのページテーブルを複製と 子プロセス自身のタスク構造の作成のため
の時間とメモリーが必要なことである。
glibc 2.3.3 以降では、 NPTL スレッド実装の一部として提供されている glibc のfork() ラッパー関数は、 カーネ
ルの fork() システムコール を起動するのではなく、clone(2) を起動する。 clone(2) に渡すフラグとして、伝統
的な fork() システムコールと 同じ効果が得られるようなフラグが指定される (fork() の呼び出しは、 flags に
SIGCHLD だけを指定して clone(2) を呼び出すのと等価である)。 glibc のラッパー関数は pthread_atfork(3) を
使って設定されている 任意の fork ハンドラーを起動する。
例
pipe(2) および wait(2) を参照。
関連項目
clone(2), execve(2), exit(2), setrlimit(2), unshare(2), vfork(2), wait(2), daemon(3), capabilities(7),
credentials(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告
に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
Linux 2014-05-28 FORK(2)