OSDN Git Service

(split) LDP: draft snapshot generated from latest pthread/ja.po files.
[linuxjm/LDP_man-pages.git] / release / man2 / fork.2
1 .\" Hey Emacs! This file is -*- nroff -*- source.
2 .\"
3 .\" Copyright (C) 2006 Michael Kerrisk <mtk.manpages@gmail.com>
4 .\" A few fragments remain from an earlier (1992) page by
5 .\" Drew Eckhardt (drew@cs.colorado.edu),
6 .\"
7 .\" Permission is granted to make and distribute verbatim copies of this
8 .\" manual provided the copyright notice and this permission notice are
9 .\" preserved on all copies.
10 .\"
11 .\" Permission is granted to copy and distribute modified versions of this
12 .\" manual under the conditions for verbatim copying, provided that the
13 .\" entire resulting derived work is distributed under the terms of a
14 .\" permission notice identical to this one.
15 .\"
16 .\" Since the Linux kernel and libraries are constantly changing, this
17 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
18 .\" responsibility for errors or omissions, or for damages resulting from
19 .\" the use of the information contained herein.  The author(s) may not
20 .\" have taken the same level of care in the production of this manual,
21 .\" which is licensed free of charge, as they might when working
22 .\" professionally.
23 .\"
24 .\" Formatted or processed versions of this manual, if unaccompanied by
25 .\" the source, must acknowledge the copyright and authors of this work.
26 .\"
27 .\" Modified by Michael Haardt (michael@moria.de)
28 .\" Modified Sat Jul 24 13:22:07 1993 by Rik Faith (faith@cs.unc.edu)
29 .\" Modified 21 Aug 1994 by Michael Chastain (mec@shell.portal.com):
30 .\"   Referenced 'clone(2)'.
31 .\" Modified 1995-06-10, 1996-04-18, 1999-11-01, 2000-12-24
32 .\"   by Andries Brouwer (aeb@cwi.nl)
33 .\" Modified, 27 May 2004, Michael Kerrisk <mtk.manpages@gmail.com>
34 .\"     Added notes on capability requirements
35 .\" 2006-09-04, Michael Kerrisk
36 .\"     Greatly expanded, to describe all attributes that differ
37 .\"     parent and child.
38 .\"
39 .\" Japanese Version Copyright (c) 1996 TABATA Tomohira
40 .\"         all rights reserved.
41 .\" Translated Thu Jun 27 20:35:06 JST 1996
42 .\"         by TABATA Tomohira <loba@k2.t.u-tokyo.ac.jp>
43 .\" Modified Sun Dec 14 00:43:22 JST 1997
44 .\"         by HANATAKA Shinya <hanataka@abyss.rim.or.jp>
45 .\" Modified Tue Jul 10 05:36:22 JST 2001
46 .\"         by Yuichi SATO <ysato@h4.dion.ne.jp>, LDP v1.38
47 .\" Updated & Modified Wed Dec 29 12:33:12 JST 2004
48 .\"         by Yuichi SATO <ysato444@yahoo.co.jp>, LDP v2.01
49 .\" Updated & Modified Wed Jan  3 04:11:03 JST 2007 by Yuichi SATO, LDP v2.43
50 .\" Updated 2008-08-04, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v3.05
51 .\"
52 .TH FORK 2 2009-04-27 "Linux" "Linux Programmer's Manual"
53 .SH 名前
54 fork \- 子プロセスを生成する
55 .SH 書式
56 .B #include <unistd.h>
57 .sp
58 .B pid_t fork(void);
59 .SH 説明
60 .BR fork ()
61 は呼び出し元プロセスを複製して新しいプロセスを生成する。
62 \fIchild\fP で参照される新しいプロセスは、以下の点を除き、
63 \fIparent\fP で参照される呼び出し元プロセスの完全な複製である:
64 .IP * 3
65 子プロセスは独自のプロセス ID を持ち、
66 この PID は既存のどのプロセスグループ
67 .RB ( setpgid (2))
68 の ID とも一致しない。
69 .IP *
70 子プロセスの親プロセス ID は、親プロセスのプロセス ID と同じである。
71 .IP *
72 子プロセスは親プロセスのメモリロック
73 .RB ( mlock (2),
74 .BR mlockall (2))
75 を引き継がない。
76 .IP *
77 プロセスの資源利用量
78 .RB ( getrusage (2))
79 と CPU タイムカウンタ
80 .RB ( times (2))
81 が、子プロセスでは 0 にリセットされる。
82 .IP *
83 子プロセスの処理待ちのシグナルの集合
84 .RB ( sigpending (2))
85 は、初期状態では空になる。
86 .IP *
87 子プロセスは親プロセスからセマフォ調整
88 .RB ( semop (2))
89 を引き継がない。
90 .IP *
91 子プロセスは親プロセスからレコードロック
92 .RB ( fcntl (2))
93 を引き継がない。
94 .IP *
95 子プロセスは親プロセスからタイマー
96 .RB ( setitimer (2),
97 .BR alarm (2),
98 .BR timer_create (2))
99 を引き継がない。
100 .IP *
101 子プロセスは親プロセスから主だった非同期 I/O 操作を引き継がない
102 .RB ( aio_read (3),
103 .BR aio_write (3)
104 参照)。
105 また、親プロセスから非同期 I/O コンテキストを引き継がない
106 .RB ( io_setup (2)
107 参照)。
108 .PP
109 上記のリストにあるプロセス属性は、POSIX.1-2001 で全て指定されている。
110 親プロセスと子プロセスは、以下の Linux 固有のプロセス属性も異なる:
111 .IP * 3
112 子プロセスは親プロセスからディレクトリ変更通知 (dnotify)
113 .RB ( fcntl (2)
114 における
115 .B F_NOTIFY
116 の説明を参照) を引き継がない。
117 .IP *
118 .BR prctl (2)
119
120 .B PR_SET_PDEATHSIG
121 の設定がリセットされ、子プロセスは親プロセスが終了したときに
122 シグナルを受信しない。
123 .IP *
124 .BR madvise (2)
125
126 .B MADV_DONTFORK
127 フラグでマークされたメモリマッピングは、
128 .BR fork ()
129 によって引き継がれない。
130 .IP *
131 子プロセスの終了シグナルは常に
132 .B SIGCHLD
133 である
134 .RB ( clone (2)
135 を参照)。
136 .PP
137 さらに以下の点について注意すること:
138 .IP * 3
139 子プロセスはシングルスレッドで生成される。つまり、
140 .BR fork ()
141 を呼び出したスレッドとなる。
142 親プロセスの仮想アドレス空間全体が子プロセスに複製される。
143 これにはミューテックス (mutex) の状態・条件変数・
144 pthread オブジェクトが含まれる。
145 これが引き起こす問題を扱うには、
146 .BR pthread_atfork (3)
147 を使うと良いだろう。
148 .IP *
149 子プロセスは親プロセスが持つ
150 オープンファイルディスクリプタの集合のコピーを引き継ぐ。
151 子プロセスの各ファイルディスクリプタは、
152 親プロセスのファイルディスクリプタに対応する
153 同じオープンファイル記述 (file description) を参照する
154 .RB ( open (2)
155 を参照)。
156 これは 2 つのディスクリプタが、ファイル状態フラグ・
157 現在のファイルオフセット、シグナル駆動 (signal-driven) I/O 属性
158 .RB ( fcntl (2)
159 における
160 .BR F_SETOWN ,
161 .B F_SETSIG
162 の説明を参照) を共有することを意味する。
163 .IP *
164 子プロセスは親プロセスが持つオープンメッセージキューディスクリプタ
165 .RB ( mq_overview (7)
166 を参照) の集合のコピーを引き継ぐ。
167 子プロセスの各ディスクリプタは、
168 親プロセスのディスクリプタに対応する
169 同じオープンメッセージキューディスクリプタを参照する。
170 これは 2 つのディスクリプタが同じフラグ
171 .RI ( mq_flags )
172 を共有することを意味する。
173 .IP *
174 子プロセスは、親プロセスのオープン済みのディレクトリストリームの集合
175 .RB ( opendir (3)
176 参照) のコピーを継承する。
177 POSIX.1-2001 では、親プロセスと子プロセス間の対応するディレクトリストリーム
178 はディレクトリストリームの位置 (positioning) を共有してもよいとされている。
179 Linux/glibc ではディレクトリストリームの位置の共有は行われていない。
180 .SH 返り値
181 成功した場合、親プロセスには子プロセスの PID が返され、
182 子プロセスには 0 が返される。
183 失敗した場合、親プロセスに \-1 が返され、子プロセスは生成されず、
184 .I errno
185 が適切に設定される。
186 .SH エラー
187 .TP
188 .B EAGAIN
189 親プロセスのページ・テーブルのコピーと
190 子プロセスのタスク構造に生成に必要なメモリを
191 .BR fork ()
192 が割り当てることができなかった。
193 .TP
194 .B EAGAIN
195 呼び出し元の
196 .B RLIMIT_NPROC
197 資源の制限 (resource limit) に達したために、新しいプロセスを生成できなかった。
198 この制限を超えるには、プロセスは
199 .B CAP_SYS_ADMIN
200 または
201 .B CAP_SYS_RESOURCE
202 ケーパビリティ (capability) を持っていなくてはならない。
203 .TP
204 .B ENOMEM
205 メモリが足りないために、
206 .BR fork ()
207 は必要なカーネル構造体を割り当てることができなかった。
208 .SH 準拠
209 SVr4, 4.3BSD, POSIX.1-2001.
210 .SH 注意
211 Linux では、
212 .BR fork ()
213 を 書き込み時コピー (copy-on-write)・ページを用いて実装している。
214 したがって、fork を行うことの唯一のデメリットは、
215 親プロセスのページ・テーブルを複製と
216 子プロセス自身のタスク構造の作成のための時間とメモリが必要なことである。
217
218 glibc 2.3.3 以降では、
219 NPTL スレッド実装の一部として提供されている glibc の
220 .BR fork ()
221 ラッパー関数は、
222 カーネルの
223 .BR fork ()
224 システムコールを起動するのではなく、
225 .BR clone (2)
226 を起動する。
227 .BR clone (2)
228 に渡すフラグとして、伝統的な
229 .BR fork ()
230 システムコールと同じ効果が得られるようなフラグが指定される。
231 glibc のラッパー関数は
232 .BR pthread_atfork (3)
233 を使って設定されている任意の fork ハンドラを起動する。
234 .\" getpid(2) が正しい値を返すことができるように何らかの処理を行う。
235
236 .SH 例
237 .BR pipe (2)
238 および
239 .BR wait (2)
240 を参照。
241 .SH 関連項目
242 .BR clone (2),
243 .BR execve (2),
244 .BR setrlimit (2),
245 .BR unshare (2),
246 .BR vfork (2),
247 .BR wait (2),
248 .BR daemon (3),
249 .BR capabilities (7),
250 .BR credentials (7)