OSDN Git Service

(split) LDP: Update draft and release pages (based on the previous commit)
[linuxjm/LDP_man-pages.git] / release / man2 / clone.2
1 .\" Copyright (c) 1992 Drew Eckhardt <drew@cs.colorado.edu>, March 28, 1992
2 .\" and Copyright (c) Michael Kerrisk, 2001, 2002, 2005, 2013
3 .\"
4 .\" %%%LICENSE_START(GPL_NOVERSION_ONELINE)
5 .\" May be distributed under the GNU General Public License.
6 .\" %%%LICENSE_END
7 .\"
8 .\" Modified by Michael Haardt <michael@moria.de>
9 .\" Modified 24 Jul 1993 by Rik Faith <faith@cs.unc.edu>
10 .\" Modified 21 Aug 1994 by Michael Chastain <mec@shell.portal.com>:
11 .\"   New man page (copied from 'fork.2').
12 .\" Modified 10 June 1995 by Andries Brouwer <aeb@cwi.nl>
13 .\" Modified 25 April 1998 by Xavier Leroy <Xavier.Leroy@inria.fr>
14 .\" Modified 26 Jun 2001 by Michael Kerrisk
15 .\"     Mostly upgraded to 2.4.x
16 .\"     Added prototype for sys_clone() plus description
17 .\"     Added CLONE_THREAD with a brief description of thread groups
18 .\"     Added CLONE_PARENT and revised entire page remove ambiguity
19 .\"             between "calling process" and "parent process"
20 .\"     Added CLONE_PTRACE and CLONE_VFORK
21 .\"     Added EPERM and EINVAL error codes
22 .\"     Renamed "__clone" to "clone" (which is the prototype in <sched.h>)
23 .\"     various other minor tidy ups and clarifications.
24 .\" Modified 26 Jun 2001 by Michael Kerrisk <mtk.manpages@gmail.com>
25 .\"     Updated notes for 2.4.7+ behavior of CLONE_THREAD
26 .\" Modified 15 Oct 2002 by Michael Kerrisk <mtk.manpages@gmail.com>
27 .\"     Added description for CLONE_NEWNS, which was added in 2.4.19
28 .\" Slightly rephrased, aeb.
29 .\" Modified 1 Feb 2003 - added CLONE_SIGHAND restriction, aeb.
30 .\" Modified 1 Jan 2004 - various updates, aeb
31 .\" Modified 2004-09-10 - added CLONE_PARENT_SETTID etc. - aeb.
32 .\" 2005-04-12, mtk, noted the PID caching behavior of NPTL's getpid()
33 .\"     wrapper under BUGS.
34 .\" 2005-05-10, mtk, added CLONE_SYSVSEM, CLONE_UNTRACED, CLONE_STOPPED.
35 .\" 2005-05-17, mtk, Substantially enhanced discussion of CLONE_THREAD.
36 .\" 2008-11-18, mtk, order CLONE_* flags alphabetically
37 .\" 2008-11-18, mtk, document CLONE_NEWPID
38 .\" 2008-11-19, mtk, document CLONE_NEWUTS
39 .\" 2008-11-19, mtk, document CLONE_NEWIPC
40 .\" 2008-11-19, Jens Axboe, mtk, document CLONE_IO
41 .\"
42 .\" FIXME Document CLONE_NEWUSER, which is new in 2.6.23
43 .\"       (also supported for unshare()?)
44 .\"
45 .\"*******************************************************************
46 .\"
47 .\" This file was generated with po4a. Translate the source file.
48 .\"
49 .\"*******************************************************************
50 .TH CLONE 2 2013\-01\-01 Linux "Linux Programmer's Manual"
51 .SH 名前
52 clone, __clone2 \- 子プロセスを作成する
53 .SH 書式
54 .nf
55 .\" Actually _BSD_SOURCE || _SVID_SOURCE
56 .\" FIXME See http://sources.redhat.com/bugzilla/show_bug.cgi?id=4749
57 \fB#define _GNU_SOURCE\fP             /* feature_test_macros(7) 参照 */
58 \fB#include <sched.h>\fP
59
60 \fBint clone(int (*\fP\fIfn\fP\fB)(void *), void *\fP\fIchild_stack\fP\fB,\fP
61 \fB          int \fP\fIflags\fP\fB, void *\fP\fIarg\fP\fB, ... \fP
62 \fB          /* pid_t *\fP\fIptid\fP\fB, struct user_desc *\fP\fItls\fP\fB, pid_t *\fP\fIctid\fP\fB */ );\fP
63 .fi
64 .SH 説明
65 \fBclone\fP()  は \fBfork\fP(2)  と同じような方法で新しいプロセスを作成する。 \fBclone\fP()
66 には、ライブラリ関数とその下層にあたる \fBclone\fP()  システムコールが存在する。以下の説明では、システムコールの方を \fBsys_clone\fP
67 と表すこととする。 \fBsys_clone\fP に関する説明はこのマニュアルの最後の方にある。
68
69 \fBfork\fP(2)  とは異なり、これらのコールでは、子プロセス (child process)  と呼び出し元のプロセスとが、メモリ空間、
70 ファイルディスクリプタのテーブル、シグナル・ハンドラのテーブルなどの 実行コンテキストの一部を共有できる。
71 (このマニュアルにおける「呼び出し元のプロセス」は、通常は 「親プロセス」と一致する。但し、後述の \fBCLONE_PARENT\fP の項も参照のこと)
72
73 \fBclone\fP()  の主要な使用法はスレッド (threads) を実装することである:
74 一つのプログラムの中の複数のスレッドは共有されたメモリ空間で 同時に実行される。
75
76 When the child process is created with \fBclone\fP(), it executes the function
77 \fIfn\fP(\fIarg\fP).  (This differs from \fBfork\fP(2), where execution continues in
78 the child from the point of the \fBfork\fP(2)  call.)  The \fIfn\fP argument is a
79 pointer to a function that is called by the child process at the beginning
80 of its execution.  The \fIarg\fP argument is passed to the \fIfn\fP function.
81
82 \fIfn\fP(\fIarg\fP)  関数が終了すると、子プロセスは終了する。 \fIfn\fP によって返された整数が子プロセスの終了コードとなる。 子プロセスは、
83 \fBexit\fP(2)  を呼んで明示的に終了することもあるし、致命的なシグナルを受信した 場合に終了することもある。
84
85 \fIchild_stack\fP 引き数は、子プロセスによって使用されるスタックの位置を指定する。
86 子プロセスと呼び出し元のプロセスはメモリを共有することがあるため、 子プロセスは呼び出し元のプロセスと同じスタックで実行することができない。
87 このため、呼び出し元のプロセスは子プロセスのスタックのためのメモリ空間を 用意して、この空間へのポインタを \fBclone\fP()
88 へ渡さなければならない。 (HP PA プロセッサ以外の) Linux が動作する全てのプロセッサでは、 スタックは下方 (アドレスが小さい方向)
89 へと伸びる。このため、普通は \fIchild_stack\fP は子プロセスのスタックのために用意したメモリ空間の一番大きい アドレスを指すようにする。
90
91 \fIflags\fP の下位 1 バイトは子プロセスが死んだ場合に親プロセスへと送られる \fI終了シグナル (termination signal)\fP
92 の番号を指定する。このシグナルとして \fBSIGCHLD\fP 以外が指定された場合、親プロセスは、 \fBwait\fP(2)
93 で子プロセスを待つ際に、オプションとして \fB__WALL\fP または \fB__WCLONE\fP を指定しなければならない。
94 どのシグナルも指定されなかった場合、子プロセスが終了した時に親プロセス にシグナルは送られない。
95
96 \fIflags\fP には、以下の定数のうち 0個以上をビット毎の論理和 (bitwise\-or)
97 をとったものを指定できる。これらの定数は呼び出し元のプロセスと 子プロセスの間で何を共有するかを指定する:
98 .TP 
99 \fBCLONE_CHILD_CLEARTID\fP (Linux 2.5.49 以降)
100 子プロセスが終了したときに子プロセスのメモリ内の \fIctid\fP が指す場所にある子プロセスのスレッド ID を消去し、 そのアドレスで futex を
101 wake (起床) させる。 このアドレスは \fBset_tid_address\fP(2)  システムコールで変更することができる。
102 この機能はスレッドライブラリで使用される。
103 .TP 
104 \fBCLONE_CHILD_SETTID\fP (Linux 2.5.49 以降)
105 子プロセスのメモリ内の \fIctid\fP が指す場所に子プロセスのスレッド ID を格納する。
106 .TP 
107 \fBCLONE_FILES\fP (Linux 2.0 以降)
108 \fBCLONE_FILES\fP が設定された場合、呼び出し元のプロセスと子プロセスはファイルディスクリプタの テーブルを共有する。
109 呼び出し元プロセスとその子プロセスの一方が作成した ファイルディスクリプタは、もう一方においても有効である。
110 同じように、一方のプロセスがファイルディスクリプタを閉じたり、 (\fBfcntl\fP(2)  \fBF_SETFD\fP 操作を使って)
111 ディスクリプタに関連するフラグを変更したりすると、 もう一方のプロセスにも影響する。
112
113 \fBCLONE_FILES\fP が設定されていない場合、子プロセスは、 \fBclone\fP()
114 が実行された時点で、呼び出し元のプロセスがオープンしている全ての ファイルディスクリプタのコピーを継承する
115 (子プロセスの複製されたファイルディスクリプタは、 対応する呼び出し元のプロセスのファイルディスクリプタと 同じファイル記述 (\fBopen\fP(2)
116 参照) を参照する)。 これ以降に、呼び出し元のプロセスと子プロセスの一方が ファイルディスクリプタの操作 (ファイルディスクリプタの
117 オープン・クローズや、ファイルディスクリプタ・フラグの変更)  を行っても、もう一方のプロセスには影響を与えない。
118 .TP 
119 \fBCLONE_FS\fP (Linux 2.0 以降)
120 \fBCLONE_FS\fP が設定された場合、呼び出し元のプロセスと子プロセスが同じファイル・システム
121 情報を共有する。ファイル・システム情報は、ファイル・システムのルート (root)、 カレント・ワーキング・ディレクトリ (current
122 working directory)  や umask などである。 呼び出し元のプロセスや子プロセスのどちらか一方によって \fBchroot\fP(2),
123 \fBchdir\fP(2), \fBumask\fP(2)  が呼び出されると、もう一方のプロセスにも影響が及ぶ。
124
125 \fBCLONE_FS\fP が設定されていない場合、子プロセスは、 \fBclone\fP()
126 が実行された時点での、呼び出し元のプロセスのファイル・システム情報のコピーを 使用する。 これ以降は、呼び出し元のプロセスと子プロセスの一方が
127 \fBchroot\fP(2), \fBchdir\fP(2), \fBumask\fP(2)  を呼び出しても、もう一方のプロセスには影響を与えない。
128 .TP 
129 \fBCLONE_IO\fP (Linux 2.6.25 以降)
130 \fBCLONE_IO\fP が設定された場合、新しいプロセスは呼び出し元のプロセスと I/O コンテキストを共有する。
131 このフラグが設定されていない場合には、 (\fBfork\fP(2)  の場合と同様) 新しいプロセスは自分専用の I/O コンテキストを持つ。
132
133 .\" The following based on text from Jens Axboe
134 .\" the anticipatory and CFQ scheduler
135 .\" with CFQ and AS.
136 I/O コンテキストは、ディスクスケジュールの I/O スコープである (言い換えると、I/O コンテキストは I/O スケジューラがプロセス I/O
137 の スケジューリングをモデル化するのに使用される)。 複数のプロセスが同じ I/O コンテキストを共有する場合、 これらのプロセスは I/O
138 スケジューラからは一つとして扱われる。 結果として、これらのプロセスはディスクアクセスの時間を共有するようになる。 いくつかの I/O
139 スケジューラでは、 二つのプロセスが I/O コンテキストを共有している場合、 これらのプロセスはディスクアクセスを交互に行うことができる。
140 同じプロセスの複数のスレッドが I/O を実行している場合 (例えば \fBaio_read\fP(3))、 \fBCLONE_IO\fP を利用することで I/O
141 性能を良くすることができる。
142
143 カーネルの設定が \fBCONFIG_BLOCK\fP オプション付きでない場合、 このフラグは何の意味も持たない。
144 .TP 
145 \fBCLONE_NEWIPC\fP (Linux 2.6.19 以降)
146 \fBCLONE_NEWIPC\fP が設定された場合、新しい IPC 名前空間 (namespace) でプロセスを作成する。
147 このフラグが設定されていない場合、 (\fBfork\fP(2)  の場合と同様) 呼び出し元のプロセスと同じ IPC 名前空間でプロセスが 作成される。
148 このフラグは、コンテナの実装での使用を意図して用意されたものである。
149
150 .\" commit 7eafd7c74c3f2e67c27621b987b28397110d643f
151 .\" https://lwn.net/Articles/312232/
152 An IPC namespace provides an isolated view of System V IPC objects (see
153 \fBsvipc\fP(7))  and (since Linux 2.6.30)  POSIX message queues (see
154 \fBmq_overview\fP(7)).  The common characteristic of these IPC mechanisms is
155 that IPC objects are identified by mechanisms other than filesystem
156 pathnames.
157
158 Objects created in an IPC namespace are visible to all other processes that
159 are members of that namespace, but are not visible to processes in other IPC
160 namespaces.
161
162 IPC 名前空間が破棄される時 (すなわち、その名前空間のメンバーの最後のプロセスが終了する時)、 その名前空間の全ての IPC
163 オブジェクトは自動的に破棄される。
164
165 このフラグを使用するためには、 カーネルでオプション \fBCONFIG_SYSVIPC\fP と \fBCONFIG_IPC_NS\fP を有効になっていること、
166 プロセスが特権 (\fBCAP_SYS_ADMIN\fP)  を持っていることが必要である。 このフラグは \fBCLONE_SYSVSEM\fP
167 と組み合わせて使うことはできない。
168 .TP 
169 \fBCLONE_NEWNET\fP (Linux 2.6.24 以降)
170 .\" FIXME Check when the implementation was completed
171 (このフラグの実装は、Linux 2.6.29 あたりまでに完成した。)
172
173 \fBCLONE_NEWNET\fP が設定された場合、新しいネットワーク名前空間 (network namaspace)  でプロセスを作成する。
174 このフラグが設定されていない場合、 (\fBfork\fP(2)  の場合と同様) 呼び出し元のプロセスと同じネットワーク名前空間でプロセスが 作成される。
175 このフラグは、コンテナの実装での使用を意図して用意されたものである。
176
177 .\" FIXME Add pointer to veth(4) page when it is eventually completed
178 ネットワーク名前空間は、分離されたネットワークスタックを提供するものである (ネットワークスタックとは、 ネットワークデバイスインタフェース、IPv4
179 や IPv6 プロトコルスタック、 \fI/proc/net\fP、 \fI/sys/class/net\fP ディレクトリツリー、ソケットなどである)。
180 物理ネットワークデバイスが所属できるネットワーク名前空間は一つだけである。 仮想ネットワークデバイス ("veth") のペアにより パイプ風の抽象化
181 (abstraction) が実現されており、 これを使うことで、ネットワーク名前空間間のトンネルを作成したり、
182 別の名前空間の物理ネットワークデバイスへのブリッジを作成したり することができる。
183
184 ネットワーク名前空間が解放される時 (すなわち、その名前空間の最後のプロセスが終了する時)、 物理ネットワークデバイスは初期ネットワーク名前空間
185 (initial network namespace) に戻される (親プロセスのネットワーク名前空間に戻される訳ではない)。
186
187 このフラグを使用するためには、 カーネルでオプション \fBCONFIG_NET_NS\fP を有効になっていること、 プロセスが特権
188 (\fBCAP_SYS_ADMIN\fP)  を持っていることが必要である。
189 .TP 
190 \fBCLONE_NEWNS\fP (Linux 2.4.19 以降)
191 子プロセスを新しいマウント名前空間 (mount namespace) で開始する。
192
193 各プロセスはある一つのマウント名前空間中に存在する。プロセスの \fI名前空間 (namespace)\fP
194 は、そのプロセスから見えるファイル階層を表すデータ (mount の集合) である。 \fBCLONE_NEWNS\fP フラグがセットされずに
195 \fBfork\fP(2)  か \fBclone\fP()  が呼ばれると、子プロセスは親プロセスと同じマウント名前空間に作成される。 システムコール
196 \fBmount\fP(2)、 \fBumount\fP(2)  が呼ばれると呼び出し元のプロセスのマウント名前空間が変更され、この結果
197 呼び出し元のプロセスと同じ名前空間にいるプロセスはすべて影響を受けるが、 異なるマウント名前空間にいるプロセスは影響を受けない。
198
199 \fBCLONE_NEWNS\fP フラグがセットされて \fBclone\fP()  が呼ばれると、clone で作成された子プロセスは新しいマウント名前空間で
200 開始される。新しい名前空間は親プロセスの名前空間のコピーで初期化される。
201
202 特権プロセス (\fBCAP_SYS_ADMIN\fP ケーパビリティを持つプロセス) のみが \fBCLONE_NEWNS\fP フラグを指定することができる。
203 一つの \fBclone\fP()  呼び出しで、 \fBCLONE_NEWNS\fP と \fBCLONE_FS\fP の両方を指定することはできない。
204 .TP 
205 \fBCLONE_NEWPID\fP (Linux 2.6.24 以降)
206 .\" This explanation draws a lot of details from
207 .\" http://lwn.net/Articles/259217/
208 .\" Authors: Pavel Emelyanov <xemul@openvz.org>
209 .\" and Kir Kolyshkin <kir@openvz.org>
210 .\"
211 .\" The primary kernel commit is 30e49c263e36341b60b735cbef5ca37912549264
212 .\" Author: Pavel Emelyanov <xemul@openvz.org>
213 \fBCLONE_NEWPID\fP が設定された場合、新しい PID 名前空間でプロセスを作成する。 このフラグが設定されていない場合、
214 (\fBfork\fP(2)  の場合と同様) 呼び出し元のプロセスと同じ PID 名前空間で プロセスが作成される。
215 このフラグは、コンテナの実装での使用を意図して用意されたものである。
216
217 PID 名前空間は、PID に関して分離された環境を提供するものである。 新しい名前空間における PID は 1 から始まり
218 (これはスタンドアロンのシステムと似たような感じ)、 \fBfork\fP(2), \fBvfork\fP(2), \fBclone\fP()
219 を呼び出すと、その名前空間で一意な PID を持ったプロセスが作成される。
220
221 新しい名前空間で作成される最初のプロセス (つまり、 \fBCLONE_NEWPID\fP フラグを使って作成されたプロセス) の PID は 1 であり、
222 このプロセスはその名前空間における "init" プロセスとなる。 この名前空間において孤児 (orphaned) となった子プロセスについては、
223 \fBinit\fP(8)  ではなくこのプロセスが親プロセスとなる。 昔ながらの \fBinit\fP プロセスとは違い、PID 名前空間の "init"
224 プロセスは終了 (terminated) する ことができ、その場合には、この名前空間の全てのプロセスが終了される。
225
226 PID 名前空間間には階層構造が形成される。 新しい PID 名前空間が作成されると、その名前空間のプロセスは、 新しい名前空間を作成したプロセスの
227 PID 名前空間で見える。 同様に、親の PID 名前空間自体が別の PID 名前空間の子供の場合には、 子供の PID 名前空間と親の PID
228 名前空間のプロセスはどれも 親の親の PID 名前空間でも見えることになる。 反対に、「子供」の PID 名前空間のプロセスには、
229 親の名前空間のプロセスは見えない。 名前空間に階層構造が存在するということは、個々のプロセスは 複数の PID を持つということを意味している。
230 そのプロセスが見える名前空間一つにつき PID が一つあり、 それぞれの PID は対応する名前空間において一意である。 (\fBgetpid\fP(2)
231 を呼び出すと、常にそのプロセスが存在している名前空間における PID が返される。)
232
233 .\" mount -t proc proc /proc
234 新しい名前空間の作成後には、 子プロセスにおいて、 \fBps\fP(1)  といったツールが正しく動作するように、 自身の root ディレクトリを変更し、
235 \fI/proc\fP に新しい procfs インスタンスをマウントするのがよいだろう。 (\fBflags\fP に \fBCLONE_NEWNS\fP
236 も指定されていた場合には、root ディレクトリを変更する必要はなく、 いきなり新しい procfs インスタンスを \fI/proc\fP
237 にマウントすることができる。)
238
239 このフラグを使用するためには、 カーネルでオプション \fBCONFIG_PID_NS\fP を有効になっていること、 プロセスが特権
240 (\fBCAP_SYS_ADMIN\fP)  を持っていることが必要である。 このフラグは \fBCLONE_THREAD\fP と組み合わせて使うことはできない。
241 .TP 
242 \fBCLONE_NEWUTS\fP (Linux 2.6.19 以降)
243 \fBCLONE_NEWUTS\fP が設定された場合、新しい UTS 名前空間でプロセスを作成する。 新しい UTS
244 名前空間の識別子の初期値は、呼び出し元のプロセスの UTS 名前空間の識別子を複製したものとなる。 このフラグが設定されていない場合、
245 (\fBfork\fP(2)  の場合と同様) 呼び出し元のプロセスと同じ UTS 名前空間で プロセスが作成される。
246 このフラグは、コンテナの実装での使用を意図して用意されたものである。
247
248 UTS 名前空間は、 \fBuname\fP(2)  が返す識別子の集合である。 識別子としてはドメイン名とホスト名があり、 それぞれ
249 \fBsetdomainname\fP(2), \fBsethostname\fP(2)  で修正することができる。 ある UTS
250 名前空間における識別子の変更は同じ名前空間の他のすべての プロセスに見えるが、別の UTS 名前空間のプロセスには見えない。
251
252 このフラグを使用するためには、 カーネルでオプション \fBCONFIG_UTS_NS\fP を有効になっていること、 プロセスが特権
253 (\fBCAP_SYS_ADMIN\fP)  を持っていることが必要である。
254 .TP 
255 \fBCLONE_PARENT\fP (Linux 2.3.12 以降)
256 \fBCLONE_PARENT\fP が設定された場合、新しい子供の (\fBgetppid\fP(2)  で返される)
257 親プロセスは呼び出し元のプロセスの親プロセスと同じになる。
258
259 \fBCLONE_PARENT\fP が設定されていない場合、 (\fBfork\fP(2)  と同様に) 呼び出し元のプロセスがその子供の親になる。
260
261 子供が終了した時にシグナルが送られるのは \fBgetppid\fP(2)  が返す親プロセスである点に注意すること。このため \fBCLONE_PARENT\fP
262 が設定された場合、呼び出し元のプロセスではなく呼び出し元のプロセスの 親プロセスにシグナルが送られる。
263 .TP 
264 \fBCLONE_PARENT_SETTID\fP (Linux 2.5.49 以降)
265 親プロセスと子プロセスのメモリ内の \fIptid\fP が指す領域に子プロセスのスレッド ID を格納する。 (Linux 2.5.32\-2.5.48
266 では、 同じことをする \fBCLONE_SETTID\fP というフラグが存在した。)
267 .TP 
268 \fBCLONE_PID\fP (廃止予定)
269 \fBCLONE_PID\fP が設定された場合、子プロセスは呼び出し元のプロセスと同じプロセス ID
270 で作成される。これはシステムをハッキングするのには便利だが、 それ以外にはあまり使われない。 Linux 2.3.21 以降では、
271 システムのブートプロセス (PID 0) だけがこのフラグを指定できる。 Linux 2.5.16 で削除された。
272 .TP 
273 \fBCLONE_PTRACE\fP (Linux 2.2 以降)
274 \fBCLONE_PTRACE\fP が指定され、かつ呼び出し元のプロセスが追跡 (trace) されていた場合、子プロセスも 同様に追跡される。
275 (\fBptrace\fP(2)  を参照のこと)
276 .TP 
277 \fBCLONE_SETTLS\fP (Linux 2.5.32 以降)
278 \fInewtls\fP 引き数は、新しい TLS (Thread Local Storage) ディスクリプタである。
279 (\fBset_thread_area\fP(2)  を参照のこと)
280 .TP 
281 \fBCLONE_SIGHAND\fP (Linux 2.0 以降)
282 \fBCLONE_SIGHAND\fP が設定された場合、呼び出し元のプロセスと子プロセスは同じシグナル・ハン
283 ドラのテーブルを共有する。呼び出し元のプロセスまたは子プロセスのどちらかが \fBsigaction\fP(2)
284 を呼び出してシグナルに対応する動作を変更した場合、 もう一方のプロセスのシグナル動作も変更される。 但し、呼び出し元のプロセスと子プロセスは、
285 プロセス毎に、シグナル・マスク (signal mask) と処理待ちシグナルの集合 を持っている。このため、あるプロセスは、
286 \fBsigprocmask\fP(2)  を使用して、もう一方のプロセスに影響を与えずに シグナルを禁止 (block) したり許可 (unblock)
287 したりできる。
288
289 \fBCLONE_SIGHAND\fP が設定されていない場合、子プロセスは \fBclone\fP()
290 が実行された時点での、呼び出し元のプロセスのシグナル・ハンドラの コピーを継承する。これ以降は、一方のプロセスが \fBsigaction\fP(2)
291 を呼び出しても、もう一方のプロセスには影響を与えない。
292
293 Linux 2.6.0\-test6 以降では、 \fBCLONE_SIGHAND\fP を指定する場合、 \fBCLONE_VM\fP も \fIflags\fP
294 に含めなければならない。
295 .TP 
296 \fBCLONE_STOPPED\fP (Linux 2.6.0\-test2 以降)
297 \fBCLONE_STOPPED\fP が設定されると、子プロセスは最初 (\fBSIGSTOP\fP シグナルを送られたかのように) 停止した状態となる。
298 子プロセスを再開させるには \fBSIGCONT\fP シグナルを送信しなければならない。
299
300 .\" glibc 2.8 removed this defn from bits/sched.h
301 このフラグは Linux 2.6.25 以降では\fI非推奨\fPであり、
302 Linux 2.6.38 で完全に\fI削除\fPされた。
303 .TP 
304 \fBCLONE_SYSVSEM\fP (Linux 2.5.10 以降)
305 \fBCLONE_SYSVSEM\fP がセットされると、子プロセスと呼び出し元プロセスは一つの System V セマフォのアンドゥ値リスト
306 (\fBsemop\fP(2)  参照) を共有する。このフラグがセットされていなければ、 子プロセスは独自のアンドゥリストを持つ
307 (リストの初期値は空である)。
308 .TP 
309 \fBCLONE_THREAD\fP (Linux 2.4.0\-test8以降)
310 \fBCLONE_THREAD\fP が設定された場合、子プロセスは呼び出し元のプロセスと同じスレッド・グループに 置かれる。 \fBCLONE_THREAD\fP
311 についての以降の議論を読みやすくするため、 「スレッド」という用語はスレッド・グループの中のプロセスを 参照するのに使うこととする。
312
313 スレッド・グループは、 スレッド集合で一つの PID を共有するという POSIX スレッドの概念をサポートするために Linux 2.4
314 に加えられた機能であった。 内部的には、この共有 PID はいわゆるそのスレッドグループの スレッド・グループ識別子 (TGID) である。 Linux
315 2.4 以降では、 \fBgetpid\fP(2)  の呼び出しではそのプロセスのスレッド・グループ ID を返す。
316
317 あるグループに属するスレッドは (システム全体で) 一意なスレッド ID (TID)  で区別できる。新しいスレッドの TID は \fBclone\fP()
318 の呼び出し元へ関数の結果として返され、 スレッドは自分自身の TID を \fBgettid\fP(2)  で取得できる。
319
320 \fBCLONE_THREAD\fP を指定せずに \fBclone\fP()  の呼び出しが行われると、 生成されたスレッドはそのスレッドの TID と同じ値の
321 TGID を持つ 新しいスレッド・グループに置かれる。このスレッドは 新しいスレッド・グループの「リーダー」である。
322
323 \fBCLONE_THREAD\fP を指定して作成された新しいスレッドは、 (\fBCLONE_PARENT\fP の場合と同様に)  \fBclone\fP()
324 を呼び出し元と同じ親プロセスを持つ。 そのため、 \fBgetppid\fP(2)  を呼ぶと、一つのスレッド・グループに属すスレッドは全て同じ値を返す。
325 \fBCLONE_THREAD\fP で作られたスレッドが終了した際に、 そのスレッドを \fBclone\fP()  を使って生成したスレッドには
326 \fBSIGCHLD\fP (もしくは他の終了シグナル) は送信されない。 また、 \fBwait\fP(2)
327 を使って終了したスレッドの状態を取得することもできない (そのようなスレッドは \fIdetached\fP (分離された) といわれる)。
328
329 スレッド・グループに属す全てのスレッドが終了した後、 そのスレッド・グループの親プロセスに \fBSIGCHLD\fP (もしくは他の終了シグナル)
330 が送られる。
331
332 スレッド・グループに属すいずれかのスレッドが \fBexecve\fP(2)  を実行すると、スレッド・グループ・リーダー以外の全てのスレッドは
333 終了され、新しいプロセスがそのスレッド・グループ・リーダーの下で 実行される。
334
335 スレッド・グループに属すスレッドの一つが \fBfork\fP(2)  を使って子プロセスを作成した場合、 スレッド・グループのどのスレッドであっても
336 その子供を \fBwait\fP(2)  できる。
337
338 Linux 2.5.35 以降では、 \fBCLONE_THREAD\fP を指定する場合、 \fIflags\fP に \fBCLONE_SIGHAND\fP
339 も含まれていなければならない。
340
341 \fBkill\fP(2)  を使ってスレッド・グループ全体 (つまり TGID) にシグナルを送ることもできれば、 \fBtgkill\fP(2)
342 を使って特定のスレッド (つまり TID) にシグナルを送ることもできる。
343
344 シグナルの配送と処理はプロセス全体に影響する: ハンドラを設定していないシグナルがあるスレッドに配送されると、
345 そのシグナルはスレッド・グループの全メンバーに影響を及ぼす (終了したり、停止したり、動作を継続したり、無視されたりする)。
346
347 各々のスレッドは独自のシグナルマスクを持っており、 \fBsigprocmask\fP(2)  で設定できる。 だが、処理待ちのシグナルには、
348 \fBkill\fP(2)  で送信されるプロセス全体に対するもの (つまり、スレッド・グループの どのメンバーにも配送できるもの) と、
349 \fBtgkill\fP(2)  で送信される個々のスレッドに対するものがありえる。 \fBsigpending\fP(2)
350 を呼び出すと、プロセス全体に対する処理待ちシグナルと呼び出し元の スレッドに対する処理待ちシグナルを結合したシグナル集合が返される。
351
352 \fBkill\fP(2)  を使ってスレッド・グループにシグナルが送られた場合で、 そのスレッド・グループがそのシグナルに対するシグナル・ハンドラが
353 登録されていたときには、シグナル・ハンドラはスレッド・グループの メンバーのうち、ただ一つのスレッドでだけ起動される。ハンドラが
354 起動されるスレッドは、そのシグナルを禁止 (block) していない メンバーの中から一つだけが勝手に (arbitrarily) 選ばれる。
355 スレッド・グループに属す複数のスレッドが \fBsigwaitinfo\fP(2)  を使って同じシグナルを待っている場合、
356 これらのスレッドの中から一つをカーネルが勝手に選択し、 そのスレッドが \fBkill (2)\fP を使って送信されたシグナルを受信する。
357 .TP 
358 \fBCLONE_UNTRACED\fP (Linux 2.5.46 以降)
359 \fBCLONE_UNTRACED\fP が指定されると、 trace を行っているプロセスは この子プロセスに \fBCLONE_PTRACE\fP
360 を適用することができない。
361 .TP 
362 \fBCLONE_VFORK\fP (Linux 2.2 以降)
363 \fBCLONE_VFORK\fP が設定された場合、 (\fBvfork\fP(2)  と同様に) 子プロセスが \fBexecve\fP(2)  または
364 \fB_exit\fP(2)  によって仮想メモリを解放するまで、呼び出し元のプロセスの実行は停止される。
365
366 \fBCLONE_VFORK\fP が設定されていない場合、 \fBclone\fP()  呼び出し後は、呼び出し元のプロセスと子プロセスの
367 両方がスケジュール対象となり、アプリケーションはこれらのプロセスの 実行順序に依存しないようにすべきである。
368 .TP 
369 \fBCLONE_VM\fP (Linux 2.0 以降)
370 \fBCLONE_VM\fP が設定された場合、呼び出し元のプロセスと子プロセスは同じメモリ空間で
371 実行される。特に、呼び出し元のプロセスや子プロセスの一方がメモリに 書き込んだ内容はもう一方のプロセスからも見ることができる。さらに、
372 子プロセスや呼び出し元のプロセスの一方が \fBmmap\fP(2)  や \fBmunmap\fP(2)  を使ってメモリをマップしたりアンマップした場合、
373 もう一方のプロセスにも影響が及ぶ。
374
375 \fBCLONE_VM\fP が設定されていない場合、子プロセスは \fBclone\fP()  が実行された時点での、親プロセスのメモリ空間をコピーした
376 別のメモリ空間で実行される。 一方のプロセスが行ったメモリへの書き込みや ファイルのマップ/アンマップは、 \fBfork\fP(2)
377 の場合と同様、もう一方のプロセスには影響しない。
378 .SS sys_clone
379 The \fBsys_clone\fP system call corresponds more closely to \fBfork\fP(2)  in that
380 execution in the child continues from the point of the call.  As such, the
381 \fIfn\fP and \fIarg\fP arguments of the \fBclone\fP()  wrapper function are omitted.
382 Furthermore, the argument order changes.  The raw system call interface is
383 roughly:
384 .in +4
385 .nf
386
387 \fBlong clone(unsigned long \fP\fIflags\fP\fB, void *\fP\fIchild_stack\fP\fB,\fP
388 \fB           void *\fP\fIptid\fP\fB, void *\fP\fIctid\fP\fB,\fP
389 \fB           struct pt_regs *\fP\fIregs\fP\fB);\fP
390
391 .fi
392 .in
393 \fBsys_clone\fP のもう一つの違いは、 \fIchild_stack\fP 引き数がゼロでも良いことである。この場合には、どちらかのプロセスが
394 スタックを変更した時に、書き込み時コピー (copy\-on\-write) 方式により
395 子プロセスがスタック・ページの独立したコピーを得られることが保証される。 この場合、正常に動作させるためには、 \fBCLONE_VM\fP
396 オプションを指定してはならない。
397 .SS "Linux 2.4 and earlier"
398 Linux 2.4 以前では、 \fBclone\fP()  は引き数 \fIptid\fP, \fItls\fP, \fIctid\fP を取らない。
399 .SH 返り値
400 .\" gettid(2) returns current->pid;
401 .\" getpid(2) returns current->tgid;
402 成功した場合、呼び出し元の実行スレッドには子プロセスのスレッドID が返される。 失敗した場合、 呼び出し元のコンテキストには \-1
403 が返され、子プロセスは 作成されず、 \fIerrno\fP が適切に設定される。
404 .SH エラー
405 .TP 
406 \fBEAGAIN\fP
407 すでに実行中のプロセスが多すぎる。
408 .TP 
409 \fBEINVAL\fP
410 \fBCLONE_SIGHAND\fP が指定されていたが、 \fBCLONE_VM\fP が指定されていなかった。 (Linux 2.6.0\-test6 以降)
411 .TP 
412 \fBEINVAL\fP
413 .\" .TP
414 .\" .B EINVAL
415 .\" Precisely one of
416 .\" .B CLONE_DETACHED
417 .\" and
418 .\" .B CLONE_THREAD
419 .\" was specified.
420 .\" (Since Linux 2.6.0-test6.)
421 \fBCLONE_THREAD\fP が指定されていたが、 \fBCLONE_SIGHAND\fP が指定されていなかった。 (Linux 2.5.35 以降)
422 .TP 
423 \fBEINVAL\fP
424 \fBCLONE_FS\fP と \fBCLONE_NEWNS\fP の両方が \fIflags\fP に指定された。
425 .TP 
426 \fBEINVAL\fP
427 \fBCLONE_NEWIPC\fP と \fBCLONE_SYSVSEM\fP の両方が \fIflags\fP に指定された。
428 .TP 
429 \fBEINVAL\fP
430 \fBCLONE_NEWPID\fP と \fBCLONE_THREAD\fP の両方が \fIflags\fP に指定された。
431 .TP 
432 \fBEINVAL\fP
433 \fIchild_stack\fP にゼロを指定した場合に \fBclone\fP()  が返す。
434 .TP 
435 \fBEINVAL\fP
436 \fIflags\fP に \fBCLONE_NEWIPC\fP が指定されたが、カーネルでオプション \fBCONFIG_SYSVIPC\fP と
437 \fBCONFIG_IPC_NS\fP が有効になっていなかった。
438 .TP 
439 \fBEINVAL\fP
440 \fIflags\fP に \fBCLONE_NEWNET\fP が指定されたが、カーネルでオプション \fBCONFIG_NET_NS\fP が有効になっていなかった。
441 .TP 
442 \fBEINVAL\fP
443 \fIflags\fP に \fBCLONE_NEWPID\fP が指定されたが、カーネルでオプション \fBCONFIG_PID_NS\fP が有効になっていなかった。
444 .TP 
445 \fBEINVAL\fP
446 \fIflags\fP に \fBCLONE_NEWUTS\fP が指定されたが、カーネルでオプション \fBCONFIG_UTS\fP が有効になっていなかった。
447 .TP 
448 \fBENOMEM\fP
449 子プロセスのために確保すべきタスク構造体や、呼び出し元のコンテキストの 一部をコピーするのに必要なメモリを十分に割り当てることができない。
450 .TP 
451 \fBEPERM\fP
452 非特権プロセス (\fBCAP_SYS_ADMIN\fP を持たないプロセス) が \fBCLONE_NEWIPC\fP, \fBCLONE_NEWNET\fP,
453 \fBCLONE_NEWNS\fP, \fBCLONE_NEWPID\fP, \fBCLONE_NEWUTS\fP を指定した。
454 .TP 
455 \fBEPERM\fP
456 PID が 0 以外のプロセスによって \fBCLONE_PID\fP が指定された。
457 .SH バージョン
458 libc5 には \fBclone\fP()  はない。glibc2 では \fBclone\fP()  が提供されており、このマニュアルページに記載の通りである。
459 .SH 準拠
460 \fBclone\fP()  と \fBsys_clone\fP コールは Linux 特有であり、移植を考慮したプログラムでは使用すべき ではない。
461 .SH 注意
462 カーネル 2.4.x 系列では、一般的には \fBCLONE_THREAD\fP フラグを指定しても新しいスレッドの親を
463 呼び出し元プロセスの親と同じにはしない。 しかし、バージョン 2.4.7〜2.4.18 のカーネルでは、 (カーネル 2.6 と同じように)
464 CLONE_THREAD フラグを指定すると、 暗黙のうちに CLONE_PARENT フラグを指定したことになる。
465
466 \fBCLONE_DETACHED\fP というフラグが、2.5.32 で導入されて以来しばらくの間存在した。
467 このフラグは親プロセスが子プロセス終了のシグナルを必要としないことを 表すものである。 2.6.2 で、 CLONE_DETATCHED を
468 CLONE_THREAD と一緒に指定する必要はなくなった。 このフラグはまだ定義されているが、何の効果もない。
469
470 i386 上では、 \fBclone\fP()  は vsyscall 経由ではなく、直接 \fIint $0x80\fP 経由で呼び出すべきである。
471
472 ia64 では、別のシステムコールが使用される:
473 .nf
474
475 \fBint __clone2(int (*\fP\fIfn\fP\fB)(void *), \fP
476 \fB             void *\fP\fIchild_stack_base\fP\fB, size_t \fP\fIstack_size\fP\fB,\fP
477 \fB             int \fP\fIflags\fP\fB, void *\fP\fIarg\fP\fB, ... \fP
478 \fB          /* pid_t *\fP\fIptid\fP\fB, struct user_desc *\fP\fItls\fP\fB, pid_t *\fP\fIctid\fP\fB */ );\fP
479 .fi
480 .PP
481 \fB__clone2\fP()  システムコールは \fBclone\fP()  と同じように動作するが、以下の点が異なる:
482 \fIchild_stack_base\fP は子プロセスのスタックエリアの最小のアドレスを指し、 \fIstack_size\fP は
483 \fIchild_stack_base\fP が指し示すスタックエリアの大きさを示す。
484 .SH バグ
485 NPTL スレッド・ライブラリを含んでいる GNU C ライブラリのいくつかのバージョン には、 \fBgetpid\fP(2)
486 のラッパー関数が含まれており、このラッパー関数は PID をキャッシュする。 このキャッシュ処理が正しく動作するためには glibc の
487 \fBclone\fP()  のラッパー関数での助けが必要だが、現状の実装では、 ある状況下においてキャッシュが最新とならない可能性がある。 特に、
488 \fBclone\fP()  の呼び出し直後にシグナルが子プロセスに配送された場合に、 そのシグナルに対するハンドラ内で \fBgetpid\fP(2)
489 を呼び出すと、それまでに clone のラッパー関数が子プロセスの PID キャッシュを 更新する機会が得られていなければ、呼び出し元プロセス
490 ("親プロセス") の PID が 返される可能性がある。 (この議論では、子プロセスが \fBCLONE_THREAD\fP
491 を使って作成された場合のことは無視している。 子プロセスが \fBCLONE_THREAD\fP を作って作成された場合には、
492 呼び出し元と子プロセスは同じスレッド・グループに属すので、 \fBgetpid\fP(2)  は子プロセスと \fBclone\fP()
493 を呼び出したプロセスで同じ値を返すのが「正しい」。 キャッシュが最新とならない問題 (stale\-cache problem) は、 \fIflags\fP
494 に \fBCLONE_VM\fP が含まれている場合にも発生しない。)  本当の値を得るためには、次のようなコードを使う必要があるかもしれない。
495 .nf
496
497     #include <syscall.h>
498
499     pid_t mypid;
500
501     mypid = syscall(SYS_getpid);
502 .fi
503 .\" See also the following bug reports
504 .\" https://bugzilla.redhat.com/show_bug.cgi?id=417521
505 .\" http://sourceware.org/bugzilla/show_bug.cgi?id=6910
506 .SH EXAMPLE
507 .SS "Create a child that executes in a separate UTS namespace"
508 The following program demonstrates the use of \fBclone\fP()  to create a child
509 process that executes in a separate UTS namespace.  The child changes the
510 hostname in its UTS namespace.  Both parent and child then display the
511 system hostname, making it possible to see that the hostname differs in the
512 UTS namespaces of the parent and child.  For an example of the use of this
513 program, see \fBsetns\fP(2).
514
515 .nf
516 #define _GNU_SOURCE
517 #include <sys/wait.h>
518 #include <sys/utsname.h>
519 #include <sched.h>
520 #include <string.h>
521 #include <stdio.h>
522 #include <stdlib.h>
523 #include <unistd.h>
524
525 #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \e
526                         } while (0)
527
528 static int              /* Start function for cloned child */
529 childFunc(void *arg)
530 {
531     struct utsname uts;
532
533     /* Change hostname in UTS namespace of child */
534
535     if (sethostname(arg, strlen(arg)) == \-1)
536         errExit("sethostname");
537
538     /* Retrieve and display hostname */
539
540     if (uname(&uts) == \-1)
541         errExit("uname");
542     printf("uts.nodename in child:  %s\en", uts.nodename);
543
544     /* Keep the namespace open for a while, by sleeping.
545        This allows some experimentation\-\-for example, another
546        process might join the namespace. */
547
548     sleep(200);
549
550     return 0;           /* Child terminates now */
551 }
552
553 #define STACK_SIZE (1024 * 1024)    /* Stack size for cloned child */
554
555 int
556 main(int argc, char *argv[])
557 {
558     char *stack;                    /* Start of stack buffer */
559     char *stackTop;                 /* End of stack buffer */
560     pid_t pid;
561     struct utsname uts;
562
563     if (argc < 2) {
564         fprintf(stderr, "Usage: %s <child\-hostname>\en", argv[0]);
565         exit(EXIT_SUCCESS);
566     }
567
568     /* Allocate stack for child */
569
570     stack = malloc(STACK_SIZE);
571     if (stack == NULL)
572         errExit("malloc");
573     stackTop = stack + STACK_SIZE;  /* Assume stack grows downward */
574
575     /* Create child that has its own UTS namespace;
576        child commences execution in childFunc() */
577
578     pid = clone(childFunc, stackTop, CLONE_NEWUTS | SIGCHLD, argv[1]);
579     if (pid == \-1)
580         errExit("clone");
581     printf("clone() returned %ld\en", (long) pid);
582
583     /* Parent falls through to here */
584
585     sleep(1);           /* Give child time to change its hostname */
586
587     /* Display hostname in parent\(aqs UTS namespace. This will be
588        different from hostname in child\(aqs UTS namespace. */
589
590     if (uname(&uts) == \-1)
591         errExit("uname");
592     printf("uts.nodename in parent: %s\en", uts.nodename);
593
594     if (waitpid(pid, NULL, 0) == \-1)    /* Wait for child */
595         errExit("waitpid");
596     printf("child has terminated\en");
597
598     exit(EXIT_SUCCESS);
599 }
600 .fi
601 .SH 関連項目
602 \fBfork\fP(2), \fBfutex\fP(2), \fBgetpid\fP(2), \fBgettid\fP(2), \fBkcmp\fP(2),
603 \fBset_thread_area\fP(2), \fBset_tid_address\fP(2), \fBsetns\fP(2), \fBtkill\fP(2),
604 \fBunshare\fP(2), \fBwait\fP(2), \fBcapabilities\fP(7), \fBpthreads\fP(7)
605 .SH この文書について
606 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.50 の一部
607 である。プロジェクトの説明とバグ報告に関する情報は
608 http://www.kernel.org/doc/man\-pages/ に書かれている。