OSDN Git Service

1f3e33718e34aef5c06ad69ed65483ff0c4a1606
[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 .\"*******************************************************************
43 .\"
44 .\" This file was generated with po4a. Translate the source file.
45 .\"
46 .\"*******************************************************************
47 .\"
48 .\" Japanese Version Copyright (c) 2001 HANATAKA Shinya
49 .\"     and Copyright(c) 2002, 2005-2008 Akihiro MOTOKI
50 .\" Translated 2001-08-17, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
51 .\" Modified 2002-09-24, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
52 .\" Modified 2005-02-02, Akihiro MOTOKI
53 .\" Updated 2005-04-17, Akihiro MOTOKI
54 .\" Updated 2005-09-10, Akihiro MOTOKI
55 .\" Updated 2006-03-05, Akihiro MOTOKI, LDP v2.25
56 .\" Updated 2007-01-05, Akihiro MOTOKI, LDP v2.43
57 .\" Updated 2007-05-01, Akihiro MOTOKI, LDP v2.46
58 .\" Updated 2007-06-13, Akihiro MOTOKI, LDP v2.55
59 .\" Updated 2008-08-04, Akihiro MOTOKI, LDP v3.05
60 .\" Updated 2008-11-09, Akihiro MOTOKI, LDP v3.10
61 .\" Updated 2009-03-02, Akihiro MOTOKI, LDP v3.19
62 .\" Updated 2010-04-11, Akihiro MOTOKI, LDP v3.24
63 .\" Updated 2012-05-08, Akihiro MOTOKI <amotoki@gmail.com>
64 .\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
65 .\"
66 .TH CLONE 2 2014\-09\-21 Linux "Linux Programmer's Manual"
67 .SH 名前
68 clone, __clone2 \- 子プロセスを作成する
69 .SH 書式
70 .nf
71 /* glibc ラッパー関数のプロトタイプ */
72
73 \fB#include <sched.h>\fP
74
75 \fBint clone(int (*\fP\fIfn\fP\fB)(void *), void *\fP\fIchild_stack\fP\fB,\fP
76 \fB          int \fP\fIflags\fP\fB, void *\fP\fIarg\fP\fB, ... \fP
77 \fB          /* pid_t *\fP\fIptid\fP\fB, struct user_desc *\fP\fItls\fP\fB, pid_t *\fP\fIctid\fP\fB */ );\fP
78
79 /* 素のシステムコールのプロトタイプ */
80
81 \fBlong clone(unsigned long \fP\fIflags\fP\fB, void *\fP\fIchild_stack\fP\fB,\fP
82 \fB          void *\fP\fIptid\fP\fB, void *\fP\fIctid\fP\fB,\fP
83 \fB          struct pt_regs *\fP\fIregs\fP\fB);\fP
84 .fi
85 .sp
86 .in -4n
87 glibc ラッパー関数の機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照):
88 .in
89 .sp
90 \fBclone\fP():
91 .ad l
92 .RS 4
93 .PD 0
94 .TP  4
95 glibc 2.14 以降:
96 _GNU_SOURCE
97 .TP  4
98 .\" See http://sources.redhat.com/bugzilla/show_bug.cgi?id=4749
99 glibc 2.14 より前:
100 _BSD_SOURCE || _SVID_SOURCE
101     /* _GNU_SOURCE も定義される */
102 .PD
103 .RE
104 .ad b
105 .SH 説明
106 \fBclone\fP() は、 \fBfork\fP(2) と似た方法で新しいプロセスを作成する。
107
108 このページでは、 glibc の \fBclone\fP() ラッパー関数とその裏で呼ばれるシステムコールの両方について説明している。
109 メインの説明はラッパー関数に関するものである。 素のシステムコールにおける差分はこのページの最後の方で説明する。
110
111 \fBfork\fP(2) とは異なり、\fBclone\fP() では、子プロセス (child process)
112 と呼び出し元のプロセスとが、メモリ空間、ファイルディスクリプタのテーブル、シグナルハンドラのテーブルなどの 実行コンテキストの一部を共有できる。
113 (このマニュアルにおける「呼び出し元のプロセス」は、通常は 「親プロセス」と一致する。但し、後述の \fBCLONE_PARENT\fP の項も参照のこと)
114
115 \fBclone\fP()  の主要な使用法はスレッド (threads) を実装することである:
116 一つのプログラムの中の複数のスレッドは共有されたメモリ空間で 同時に実行される。
117
118 \fBclone\fP()  で子プロセスが作成された時に、作成された子プロセスは関数 \fIfn\fP(\fIarg\fP)  を実行する。 (この点が
119 \fBfork\fP(2)  とは異なる。 \fBfork\fP(2)  の場合、子プロセスは \fBfork\fP(2)  が呼び出された場所から実行を続ける。)
120 \fIfn\fP 引き数は、子プロセスが実行を始める時に子プロセスが呼び出す 関数へのポインタである。 \fIarg\fP 引き数はそのまま \fIfn\fP
121 関数へと渡される。
122
123 \fIfn\fP(\fIarg\fP)  関数が終了すると、子プロセスは終了する。 \fIfn\fP によって返された整数が子プロセスの終了コードとなる。 子プロセスは、
124 \fBexit\fP(2)  を呼んで明示的に終了することもあるし、致命的なシグナルを受信した 場合に終了することもある。
125
126 \fIchild_stack\fP 引き数は、子プロセスによって使用されるスタックの位置を指定する。
127 子プロセスと呼び出し元のプロセスはメモリを共有することがあるため、 子プロセスは呼び出し元のプロセスと同じスタックで実行することができない。
128 このため、呼び出し元のプロセスは子プロセスのスタックのためのメモリ空間を 用意して、この空間へのポインタを \fBclone\fP()
129 へ渡さなければならない。 (HP PA プロセッサ以外の) Linux が動作する全てのプロセッサでは、 スタックは下方 (アドレスが小さい方向)
130 へと伸びる。このため、普通は \fIchild_stack\fP は子プロセスのスタックのために用意したメモリ空間の一番大きい アドレスを指すようにする。
131
132 \fIflags\fP の下位 1 バイトは子プロセスが死んだ場合に親プロセスへと送られる \fI終了シグナル (termination signal)\fP
133 の番号を指定する。このシグナルとして \fBSIGCHLD\fP 以外が指定された場合、親プロセスは、 \fBwait\fP(2)
134 で子プロセスを待つ際に、オプションとして \fB__WALL\fP または \fB__WCLONE\fP を指定しなければならない。
135 どのシグナルも指定されなかった場合、子プロセスが終了した時に親プロセス にシグナルは送られない。
136
137 \fIflags\fP には、以下の定数のうち 0個以上をビット毎の論理和 (bitwise\-or)
138 をとったものを指定できる。これらの定数は呼び出し元のプロセスと 子プロセスの間で何を共有するかを指定する:
139 .TP 
140 \fBCLONE_CHILD_CLEARTID\fP (Linux 2.5.49 以降)
141 子プロセスが終了したときに子プロセスのメモリ内の \fIctid\fP が指す場所にある子プロセスのスレッド ID を消去し、 そのアドレスで futex を
142 wake (起床) させる。 このアドレスは \fBset_tid_address\fP(2)  システムコールで変更することができる。
143 この機能はスレッドライブラリで使用される。
144 .TP 
145 \fBCLONE_CHILD_SETTID\fP (Linux 2.5.49 以降)
146 子プロセスのメモリ内の \fIctid\fP が指す場所に子プロセスのスレッド ID を格納する。
147 .TP 
148 \fBCLONE_FILES\fP (Linux 2.0 以降)
149 \fBCLONE_FILES\fP が設定された場合、呼び出し元のプロセスと子プロセスはファイルディスクリプタの テーブルを共有する。
150 呼び出し元プロセスとその子プロセスの一方が作成した ファイルディスクリプタは、もう一方においても有効である。
151 同じように、一方のプロセスがファイルディスクリプタを閉じたり、 (\fBfcntl\fP(2)  \fBF_SETFD\fP 操作を使って)
152 ディスクリプタに関連するフラグを変更したりすると、 もう一方のプロセスにも影響する。
153
154 \fBCLONE_FILES\fP が設定されていない場合、子プロセスは、 \fBclone\fP()
155 が実行された時点で、呼び出し元のプロセスがオープンしている全ての ファイルディスクリプタのコピーを継承する
156 (子プロセスの複製されたファイルディスクリプタは、 対応する呼び出し元のプロセスのファイルディスクリプタと 同じファイル記述 (\fBopen\fP(2)
157 参照) を参照する)。 これ以降に、呼び出し元のプロセスと子プロセスの一方が ファイルディスクリプタの操作 (ファイルディスクリプタの
158 オープン・クローズや、ファイルディスクリプタ・フラグの変更)  を行っても、もう一方のプロセスには影響を与えない。
159 .TP 
160 \fBCLONE_FS\fP (Linux 2.0 以降)
161 \fBCLONE_FS\fP が設定された場合、呼び出し元のプロセスと子プロセスが同じファイルシステム
162 情報を共有する。ファイルシステム情報は、ファイルシステムのルート (root)、 カレントワーキングディレクトリ (current working
163 directory)  や umask などである。 呼び出し元のプロセスや子プロセスのどちらか一方によって \fBchroot\fP(2),
164 \fBchdir\fP(2), \fBumask\fP(2)  が呼び出されると、もう一方のプロセスにも影響が及ぶ。
165
166 \fBCLONE_FS\fP が設定されていない場合、子プロセスは、 \fBclone\fP()
167 が実行された時点での、呼び出し元のプロセスのファイルシステム情報のコピーを 使用する。 これ以降は、呼び出し元のプロセスと子プロセスの一方が
168 \fBchroot\fP(2), \fBchdir\fP(2), \fBumask\fP(2)  を呼び出しても、もう一方のプロセスには影響を与えない。
169 .TP 
170 \fBCLONE_IO\fP (Linux 2.6.25 以降)
171 \fBCLONE_IO\fP が設定された場合、新しいプロセスは呼び出し元のプロセスと I/O コンテキストを共有する。
172 このフラグが設定されていない場合には、 (\fBfork\fP(2)  の場合と同様) 新しいプロセスは自分専用の I/O コンテキストを持つ。
173
174 .\" The following based on text from Jens Axboe
175 .\" the anticipatory and CFQ scheduler
176 .\" with CFQ and AS.
177 I/O コンテキストは、ディスクスケジュールの I/O スコープである (言い換えると、I/O コンテキストは I/O スケジューラがプロセス I/O
178 の スケジューリングをモデル化するのに使用される)。 複数のプロセスが同じ I/O コンテキストを共有する場合、 これらのプロセスは I/O
179 スケジューラからは一つとして扱われる。 結果として、これらのプロセスはディスクアクセスの時間を共有するようになる。 いくつかの I/O
180 スケジューラでは、 二つのプロセスが I/O コンテキストを共有している場合、 これらのプロセスはディスクアクセスを交互に行うことができる。
181 同じプロセスの複数のスレッドが I/O を実行している場合 (例えば \fBaio_read\fP(3))、 \fBCLONE_IO\fP を利用することで I/O
182 性能を良くすることができる。
183
184 カーネルの設定が \fBCONFIG_BLOCK\fP オプション付きでない場合、 このフラグは何の意味も持たない。
185 .TP 
186 \fBCLONE_NEWIPC\fP (Linux 2.6.19 以降)
187 \fBCLONE_NEWIPC\fP が設定された場合、新しい IPC 名前空間 (namespace) でプロセスを作成する。
188 このフラグが設定されていない場合、 (\fBfork\fP(2)  の場合と同様) 呼び出し元のプロセスと同じ IPC 名前空間でプロセスが 作成される。
189 このフラグは、コンテナの実装での使用を意図して用意されたものである。
190
191 .\" commit 7eafd7c74c3f2e67c27621b987b28397110d643f
192 .\" https://lwn.net/Articles/312232/
193 IPC 名前空間は、独立の System\ V IPC オブジェクト空間 (\fBsvipc\fP(7) 参照) を提供する 。 (Linux 2.6.30
194 以降では) 独立した POSIX メッセージキュー空間 (\fBmq_overview\fP(7) 参照) も提供される。 これらの IPC
195 機構に共通の特徴として、 IPC オブジェクトはファイルシステムのパス名とは違った仕組みで識別されるという点がある。
196
197 ある IPC 名前空間に作成されたオブジェクトは、 その名前空間のメンバーである他のすべてのプロセスからも見えるが、 違う IPC
198 名前空間のプロセスからは見えない。
199
200 IPC 名前空間が破棄される時 (すなわち、その名前空間のメンバーの最後のプロセスが終了する時)、 その名前空間の全ての IPC
201 オブジェクトは自動的に破棄される。
202
203 特権プロセス (\fBCAP_SYS_ADMIN\fP) だけが \fBCLONE_NEWIPC\fP を使用できる。 このフラグは
204 \fBCLONE_SYSVSEM\fP と組み合わせて指定することはできない。
205
206 IPC 名前空間の詳細は \fBnamespaces\fP(7) を参照。
207 .TP 
208 \fBCLONE_NEWNET\fP (Linux 2.6.24 以降)
209 (このフラグの実装は、Linux 2.6.29 あたりまでには完成した。)
210
211 \fBCLONE_NEWNET\fP が設定された場合、新しいネットワーク名前空間 (network namaspace)  でプロセスを作成する。
212 このフラグが設定されていない場合、 (\fBfork\fP(2)  の場合と同様) 呼び出し元のプロセスと同じネットワーク名前空間でプロセスが 作成される。
213 このフラグは、コンテナの実装での使用を意図して用意されたものである。
214
215 .\" FIXME . Add pointer to veth(4) page when it is eventually completed
216 ネットワーク名前空間は、分離されたネットワークスタックを提供するものである (ネットワークスタックとは、 ネットワークデバイスインタフェース、IPv4
217 や IPv6 プロトコルスタック、 \fI/proc/net\fP、 \fI/sys/class/net\fP ディレクトリツリー、ソケットなどである)。
218 物理ネットワークデバイスが所属できるネットワーク名前空間は一つだけである。 仮想ネットワークデバイス ("veth") のペアにより パイプ風の抽象化
219 (abstraction) が実現されており、 これを使うことで、ネットワーク名前空間間のトンネルを作成したり、
220 別の名前空間の物理ネットワークデバイスへのブリッジを作成したり することができる。
221
222 ネットワーク名前空間が解放される時 (すなわち、その名前空間の最後のプロセスが終了する時)、 物理ネットワークデバイスは初期ネットワーク名前空間
223 (initial network namespace) に戻される (親プロセスのネットワーク名前空間に戻される訳ではない)。
224 ネットワーク名前空間のさらなる情報は \fBnamespaces\fP(7) を参照。
225
226 特権プロセス (\fBCAP_SYS_ADMIN\fP) だけが \fBCLONE_NEWNET\fP を使用できる。
227 .TP 
228 \fBCLONE_NEWNS\fP (Linux 2.4.19 以降)
229 \fBCLONE_NEWNS\fP がセットされている場合、 clone で作成された子プロセスは新しいマウント名前空間で開始され、
230 新しい名前空間は親プロセスの名前空間のコピーで初期化される。 \fBCLONE_NEWNS\fP がセットされていない場合、
231 子プロセスは親プロセスと同じマウント名前空間となる。
232
233 マウント名前空間の詳細は \fBnamespaces\fP(7) を参照。
234
235 .\" See https://lwn.net/Articles/543273/
236 特権プロセス (\fBCAP_SYS_ADMIN\fP) のみが \fBCLONE_NEWNS\fP を指定することができる。 一つの \fBclone\fP()
237 呼び出しで、 \fBCLONE_NEWNS\fP と \fBCLONE_FS\fP の両方を指定することはできない。
238 .TP 
239 \fBCLONE_NEWPID\fP (Linux 2.6.24 以降)
240 .\" This explanation draws a lot of details from
241 .\" http://lwn.net/Articles/259217/
242 .\" Authors: Pavel Emelyanov <xemul@openvz.org>
243 .\" and Kir Kolyshkin <kir@openvz.org>
244 .\"
245 .\" The primary kernel commit is 30e49c263e36341b60b735cbef5ca37912549264
246 .\" Author: Pavel Emelyanov <xemul@openvz.org>
247 \fBCLONE_NEWPID\fP が設定された場合、新しい PID 名前空間でプロセスを作成する。 このフラグが設定されていない場合、
248 (\fBfork\fP(2)  の場合と同様) 呼び出し元のプロセスと同じ PID 名前空間で プロセスが作成される。
249 このフラグは、コンテナの実装での使用を意図して用意されたものである。
250
251 PID 名前空間の詳細は \fBnamespaces\fP(7) と \fBpid_namespaces\fP(7) を参照。
252
253 特権プロセス (\fBCAP_SYS_ADMIN\fP) だけが \fBCLONE_NEWPID\fP を使用できる。 このフラグは \fBCLONE_THREAD\fP
254 や \fBCLONE_PARENT\fP と組み合わせて指定することはできない。
255 .TP 
256 \fBCLONE_NEWUSER\fP
257 (このフラグが \fBclone\fP() で意味を持つようになったのは Linux 2.6.23 である。 現在の \fBclone\fP()
258 の動作が取り込まれたのは Linux 3.5 であり、 ユーザー名前空間が完全に機能するようにする最後の機能が取り込まれたのは Linux 3.8
259 である。)
260
261 \fBCLONE_NEWUSER\fP がセットされている場合、新しいユーザー名前空間でプロセスを作成する。 このフラグがセットされていない場合、
262 (\fBfork\fP(2)  の場合と同様に) 呼び出し元のプロセスと同じユーザー名前空間でプロセスが作成される。
263
264 ユーザー名前空間の詳細は \fBnamespaces\fP(7) と \fBuser_namespaces\fP(7) を参照。
265
266 .\" Before Linux 2.6.29, it appears that only CAP_SYS_ADMIN was needed
267 Linux 3.8 より前では、 \fBCLONE_NEWUSER\fP を使用するには、 呼び出し元は \fBCAP_SYS_ADMIN\fP,
268 \fBCAP_SETUID\fP, \fBCAP_SETGID\fP の 3 つのケーパリビティを持っている必要があった。 Linux 3.8 以降では、
269 ユーザー名前空間を作成するのに特権は必要なくなった。
270
271 .\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71
272 .\" https://lwn.net/Articles/543273/
273 .\" The fix actually went into 3.9 and into 3.8.3. However, user namespaces
274 .\" were, for practical purposes, unusable in earlier 3.8.x because of the
275 .\" various filesystems that didn't support userns.
276 このフラグは \fBCLONE_THREAD\fP や \fBCLONE_PARENT\fP と組み合わせて指定することはできない。 セキュリティ上の理由から、
277 \fBCLONE_NEWUSER\fP は \fBCLONE_FS\fP と組み合わせて指定することはできない。
278
279 ユーザー名前空間の詳細は \fBuser_namespaces\fP(7) を参照。
280 .TP 
281 \fBCLONE_NEWUTS\fP (Linux 2.6.19 以降)
282 \fBCLONE_NEWUTS\fP が設定された場合、新しい UTS 名前空間でプロセスを作成する。 新しい UTS
283 名前空間の識別子の初期値は、呼び出し元のプロセスの UTS 名前空間の識別子を複製したものとなる。 このフラグが設定されていない場合、
284 (\fBfork\fP(2)  の場合と同様) 呼び出し元のプロセスと同じ UTS 名前空間で プロセスが作成される。
285 このフラグは、コンテナの実装での使用を意図して用意されたものである。
286
287 UTS 名前空間は、 \fBuname\fP(2)  が返す識別子の集合である。 識別子としてはドメイン名とホスト名があり、 それぞれ
288 \fBsetdomainname\fP(2), \fBsethostname\fP(2)  で修正することができる。 ある UTS
289 名前空間における識別子の変更は同じ名前空間の他のすべての プロセスに見えるが、別の UTS 名前空間のプロセスには見えない。
290
291 特権プロセス (\fBCAP_SYS_ADMIN\fP) だけが \fBCLONE_NEWUTS\fP を使用できる。
292
293 UTS 名前空間の詳細は \fBnamespaces\fP(7) を参照。
294 .TP 
295 \fBCLONE_PARENT\fP (Linux 2.3.12 以降)
296 \fBCLONE_PARENT\fP が設定された場合、新しい子供の (\fBgetppid\fP(2)  で返される)
297 親プロセスは呼び出し元のプロセスの親プロセスと同じになる。
298
299 \fBCLONE_PARENT\fP が設定されていない場合、 (\fBfork\fP(2)  と同様に) 呼び出し元のプロセスがその子供の親になる。
300
301 子供が終了した時にシグナルが送られるのは \fBgetppid\fP(2)  が返す親プロセスである点に注意すること。このため \fBCLONE_PARENT\fP
302 が設定された場合、呼び出し元のプロセスではなく呼び出し元のプロセスの 親プロセスにシグナルが送られる。
303 .TP 
304 \fBCLONE_PARENT_SETTID\fP (Linux 2.5.49 以降)
305 親プロセスと子プロセスのメモリ内の \fIptid\fP が指す領域に子プロセスのスレッド ID を格納する。 (Linux 2.5.32\-2.5.48
306 では、 同じことをする \fBCLONE_SETTID\fP というフラグが存在した。)
307 .TP 
308 \fBCLONE_PID\fP (廃止予定)
309 \fBCLONE_PID\fP が設定された場合、子プロセスは呼び出し元のプロセスと同じプロセス ID
310 で作成される。これはシステムをハッキングするのには便利だが、 それ以外にはあまり使われない。 Linux 2.3.21 以降では、
311 システムのブートプロセス (PID 0) だけがこのフラグを指定できる。 Linux 2.5.16 で削除された。
312 .TP 
313 \fBCLONE_PTRACE\fP (Linux 2.2 以降)
314 \fBCLONE_PTRACE\fP が指定され、かつ呼び出し元のプロセスが追跡 (trace) されていた場合、子プロセスも 同様に追跡される。
315 (\fBptrace\fP(2)  を参照のこと)
316 .TP 
317 \fBCLONE_SETTLS\fP (Linux 2.5.32 以降)
318 \fInewtls\fP 引き数は、新しい TLS (Thread Local Storage) ディスクリプタである。
319 (\fBset_thread_area\fP(2)  を参照のこと)
320 .TP 
321 \fBCLONE_SIGHAND\fP (Linux 2.0 以降)
322 \fBCLONE_SIGHAND\fP が設定された場合、呼び出し元のプロセスと子プロセスは同じシグナルハン
323 ドラのテーブルを共有する。呼び出し元のプロセスまたは子プロセスのどちらかが \fBsigaction\fP(2)
324 を呼び出してシグナルに対応する動作を変更した場合、 もう一方のプロセスのシグナル動作も変更される。 但し、呼び出し元のプロセスと子プロセスは、
325 プロセス毎に、シグナルマスク (signal mask) と処理待ちシグナルの集合 を持っている。このため、あるプロセスは、
326 \fBsigprocmask\fP(2)  を使用して、もう一方のプロセスに影響を与えずに シグナルを禁止 (block) したり許可 (unblock)
327 したりできる。
328
329 \fBCLONE_SIGHAND\fP が設定されていない場合、子プロセスは \fBclone\fP()
330 が実行された時点での、呼び出し元のプロセスのシグナルハンドラの コピーを継承する。これ以降は、一方のプロセスが \fBsigaction\fP(2)
331 を呼び出しても、もう一方のプロセスには影響を与えない。
332
333 Linux 2.6.0\-test6 以降では、 \fBCLONE_SIGHAND\fP を指定する場合、 \fBCLONE_VM\fP も \fIflags\fP
334 に含めなければならない。
335 .TP 
336 \fBCLONE_STOPPED\fP (Linux 2.6.0\-test2 以降)
337 \fBCLONE_STOPPED\fP が設定されると、子プロセスは最初 (\fBSIGSTOP\fP シグナルを送られたかのように) 停止した状態となる。
338 子プロセスを再開させるには \fBSIGCONT\fP シグナルを送信しなければならない。
339
340 .\" glibc 2.8 removed this defn from bits/sched.h
341 このフラグは Linux 2.6.25 以降では\fI非推奨\fPであり、
342 Linux 2.6.38 で完全に\fI削除\fPされた。
343 .TP 
344 \fBCLONE_SYSVSEM\fP (Linux 2.5.10 以降)
345 \fBCLONE_SYSVSEM\fP がセットされると、子プロセスと呼び出し元プロセスは一つの System\ V セマフォの調整値 (\fIsemadj\fP)
346 (\fBsemop\fP(2)  参照) を共有する。 この場合、共有されたリストはこのリストを共有する全プロセスの \fIsemadj\fP 値を積算し、
347 セマフォ調整はこのリストを共有している最後のプロセスが終了した際 (または \fBunshare\fP(2) を使ってリストの共有が中止された際)
348 に実行される。 このフラグがセットされていなければ、 子プロセスは独自のセマフォ \fIsemadj\fP リストを持つ (リストの初期値は空である)。
349 .TP 
350 \fBCLONE_THREAD\fP (Linux 2.4.0\-test8以降)
351 \fBCLONE_THREAD\fP が設定された場合、子プロセスは呼び出し元のプロセスと同じスレッドグループに 置かれる。 \fBCLONE_THREAD\fP
352 についての以降の議論を読みやすくするため、 「スレッド」という用語はスレッドグループの中のプロセスを 参照するのに使うこととする。
353
354 スレッドグループは、 スレッド集合で一つの PID を共有するという POSIX スレッドの概念をサポートするために Linux 2.4
355 に加えられた機能であった。 内部的には、この共有 PID はいわゆるそのスレッドグループの スレッドグループ識別子 (TGID) である。 Linux
356 2.4 以降では、 \fBgetpid\fP(2)  の呼び出しではそのプロセスのスレッドグループ ID を返す。
357
358 あるグループに属するスレッドは (システム全体で) 一意なスレッド ID (TID)  で区別できる。新しいスレッドの TID は \fBclone\fP()
359 の呼び出し元へ関数の結果として返され、 スレッドは自分自身の TID を \fBgettid\fP(2)  で取得できる。
360
361 \fBCLONE_THREAD\fP を指定せずに \fBclone\fP()  の呼び出しが行われると、 生成されたスレッドはそのスレッドの TID と同じ値の
362 TGID を持つ 新しいスレッドグループに置かれる。このスレッドは 新しいスレッドグループの「リーダー」である。
363
364 \fBCLONE_THREAD\fP を指定して作成された新しいスレッドは、 (\fBCLONE_PARENT\fP の場合と同様に)  \fBclone\fP()
365 を呼び出し元と同じ親プロセスを持つ。 そのため、 \fBgetppid\fP(2)  を呼ぶと、一つのスレッドグループに属すスレッドは全て同じ値を返す。
366 \fBCLONE_THREAD\fP で作られたスレッドが終了した際に、 そのスレッドを \fBclone\fP()  を使って生成したスレッドには
367 \fBSIGCHLD\fP (もしくは他の終了シグナル) は送信されない。 また、 \fBwait\fP(2)
368 を使って終了したスレッドの状態を取得することもできない (そのようなスレッドは \fIdetached\fP (分離された) といわれる)。
369
370 スレッドグループに属す全てのスレッドが終了した後、 そのスレッドグループの親プロセスに \fBSIGCHLD\fP (もしくは他の終了シグナル) が送られる。
371
372 スレッドグループに属すいずれかのスレッドが \fBexecve\fP(2)  を実行すると、スレッドグループリーダー以外の全てのスレッドは
373 終了され、新しいプロセスがそのスレッドグループリーダーの下で 実行される。
374
375 スレッドグループに属すスレッドの一つが \fBfork\fP(2)  を使って子プロセスを作成した場合、 スレッドグループのどのスレッドであっても その子供を
376 \fBwait\fP(2)  できる。
377
378 Linux 2.5.35 以降では、 \fBCLONE_THREAD\fP を指定する場合、 \fIflags\fP に \fBCLONE_SIGHAND\fP
379 も含まれていなければならない (Linux 2.6.0\-test6 以降では、 \fBCLONE_SIGHAND\fP を指定する場合 \fBCLONE_VM\fP
380 も指定する必要がある点に注意すること)。
381
382 \fBkill\fP(2)  を使ってスレッドグループ全体 (つまり TGID) にシグナルを送ることもできれば、 \fBtgkill\fP(2)
383 を使って特定のスレッド (つまり TID) にシグナルを送ることもできる。
384
385 シグナルの配送と処理はプロセス全体に影響する: ハンドラを設定していないシグナルがあるスレッドに配送されると、
386 そのシグナルはスレッドグループの全メンバーに影響を及ぼす (終了したり、停止したり、動作を継続したり、無視されたりする)。
387
388 各々のスレッドは独自のシグナルマスクを持っており、 \fBsigprocmask\fP(2)  で設定できる。 だが、処理待ちのシグナルには、
389 \fBkill\fP(2)  で送信されるプロセス全体に対するもの (つまり、スレッドグループの どのメンバーにも配送できるもの) と、
390 \fBtgkill\fP(2)  で送信される個々のスレッドに対するものがありえる。 \fBsigpending\fP(2)
391 を呼び出すと、プロセス全体に対する処理待ちシグナルと呼び出し元の スレッドに対する処理待ちシグナルを結合したシグナル集合が返される。
392
393 \fBkill\fP(2)  を使ってスレッドグループにシグナルが送られた場合で、 そのスレッドグループがそのシグナルに対するシグナルハンドラが
394 登録されていたときには、シグナルハンドラはスレッドグループの メンバーのうち、ただ一つのスレッドでだけ起動される。ハンドラが
395 起動されるスレッドは、そのシグナルを禁止 (block) していない メンバーの中から一つだけが勝手に (arbitrarily) 選ばれる。
396 スレッドグループに属す複数のスレッドが \fBsigwaitinfo\fP(2)  を使って同じシグナルを待っている場合、
397 これらのスレッドの中から一つをカーネルが勝手に選択し、 そのスレッドが \fBkill (2)\fP を使って送信されたシグナルを受信する。
398 .TP 
399 \fBCLONE_UNTRACED\fP (Linux 2.5.46 以降)
400 \fBCLONE_UNTRACED\fP が指定されると、 trace を行っているプロセスは この子プロセスに \fBCLONE_PTRACE\fP
401 を適用することができない。
402 .TP 
403 \fBCLONE_VFORK\fP (Linux 2.2 以降)
404 \fBCLONE_VFORK\fP が設定された場合、 (\fBvfork\fP(2)  と同様に) 子プロセスが \fBexecve\fP(2)  または
405 \fB_exit\fP(2)  によって仮想メモリを解放するまで、呼び出し元のプロセスの実行は停止される。
406
407 \fBCLONE_VFORK\fP が設定されていない場合、 \fBclone\fP()  呼び出し後は、呼び出し元のプロセスと子プロセスの
408 両方がスケジュール対象となり、アプリケーションはこれらのプロセスの 実行順序に依存しないようにすべきである。
409 .TP 
410 \fBCLONE_VM\fP (Linux 2.0 以降)
411 \fBCLONE_VM\fP が設定された場合、呼び出し元のプロセスと子プロセスは同じメモリ空間で
412 実行される。特に、呼び出し元のプロセスや子プロセスの一方がメモリに 書き込んだ内容はもう一方のプロセスからも見ることができる。さらに、
413 子プロセスや呼び出し元のプロセスの一方が \fBmmap\fP(2)  や \fBmunmap\fP(2)  を使ってメモリをマップしたりアンマップした場合、
414 もう一方のプロセスにも影響が及ぶ。
415
416 \fBCLONE_VM\fP が設定されていない場合、子プロセスは \fBclone\fP()  が実行された時点での、親プロセスのメモリ空間をコピーした
417 別のメモリ空間で実行される。 一方のプロセスが行ったメモリへの書き込みや ファイルのマップ/アンマップは、 \fBfork\fP(2)
418 の場合と同様、もう一方のプロセスには影響しない。
419 .SS "C ライブラリとカーネル ABI の違い"
420 素の \fBclone\fP システムコールは、より \fBfork\fP(2) に近いかたちになっており、
421 子プロセスの実行が呼び出しが行われた場所から続けられる。 そのため、 \fBclone\fP() ラッパー関数の引き数 \fIfn\fP と \fIarg\fP
422 は省略される。 また、 引き数の順序も違っている。 x86 と他の多くのアーキテクチャにおける、 素のシステムコールのインターフェースは、
423 おおまかには次のようになっている。
424 .in +4
425 .nf
426
427 \fBlong clone(unsigned long \fP\fIflags\fP\fB, void *\fP\fIchild_stack\fP\fB,\fP
428 \fB           void *\fP\fIptid\fP\fB, void *\fP\fIctid\fP\fB,\fP
429 \fB           struct pt_regs *\fP\fIregs\fP\fB);\fP
430
431 .fi
432 .in
433 生のシステムコールのもう一つの違いは、 \fIchild_stack\fP 引き数がゼロでも良いことである。この場合には、どちらかのプロセスが
434 スタックを変更した時に、書き込み時コピー (copy\-on\-write) 方式により
435 子プロセスがスタックページの独立したコピーを得られることが保証される。 この場合、正常に動作させるためには、 \fBCLONE_VM\fP
436 オプションを指定してはならない。
437
438 いくつかのアーキテクチャでは、システムコールの引き数の順序は上記とは異なっている。 microblaze, ARM, ARM 64, PA\-RISC,
439 arc, Power PC, xtensa, MIPS アーキテクチャでは、 4 番目と 5 番目の引き数の順番が逆である。 cris と s390
440 アーキテクチャでは、最初と 2 番目の引き数の順番が逆である。
441 .SS "blackfin, m68k, sparc"
442 blackfin, m68k, sparc では引き数渡しの規約が上記の説明とは異なる。 詳細は、カーネル (と glibc) のソースを参照のこと。
443 .SS ia64
444 ia64 では、別のインターフェースが使用される:
445 .nf
446
447 \fBint __clone2(int (*\fP\fIfn\fP\fB)(void *), \fP
448 \fB             void *\fP\fIchild_stack_base\fP\fB, size_t \fP\fIstack_size\fP\fB,\fP
449 \fB             int \fP\fIflags\fP\fB, void *\fP\fIarg\fP\fB, ... \fP
450 \fB          /* pid_t *\fP\fIptid\fP\fB, struct user_desc *\fP\fItls\fP\fB, pid_t *\fP\fIctid\fP\fB */ );\fP
451 .fi
452 .PP
453 上記のプロトタイプは glibc ラッパー関数用のものである。 素のシステムコールのインターフェースには引き数 \fIfn\fP と \fIarg\fP がない。
454 また、引き数の順序が変わり、 \fIflags\fP が最初の引き数で、 \fItls\fP が最後の引き数である。
455 .PP
456 \fB__clone2\fP() は \fBclone\fP() と同じように動作するが、以下の点が異なる: \fIchild_stack_base\fP
457 は子プロセスのスタックエリアの最小のアドレスを指し、 \fIstack_size\fP は \fIchild_stack_base\fP
458 が指し示すスタックエリアの大きさを示す。
459 .SS "Linux 2.4 以前"
460 Linux 2.4 以前では、 \fBclone\fP()  は引き数 \fIptid\fP, \fItls\fP, \fIctid\fP を取らない。
461 .SH 返り値
462 .\" gettid(2) returns current->pid;
463 .\" getpid(2) returns current->tgid;
464 成功した場合、呼び出し元の実行スレッドには子プロセスのスレッドID が返される。 失敗した場合、 呼び出し元のコンテキストには \-1
465 が返され、子プロセスは 作成されず、 \fIerrno\fP が適切に設定される。
466 .SH エラー
467 .TP 
468 \fBEAGAIN\fP
469 すでに実行中のプロセスが多すぎる。 \fBfork\fP(2) 参照。
470 .TP 
471 \fBEINVAL\fP
472 \fBCLONE_SIGHAND\fP が指定されていたが、 \fBCLONE_VM\fP が指定されていなかった。 (Linux 2.6.0\-test6 以降)
473 .TP 
474 \fBEINVAL\fP
475 .\" .TP
476 .\" .B EINVAL
477 .\" Precisely one of
478 .\" .B CLONE_DETACHED
479 .\" and
480 .\" .B CLONE_THREAD
481 .\" was specified.
482 .\" (Since Linux 2.6.0-test6.)
483 \fBCLONE_THREAD\fP が指定されていたが、 \fBCLONE_SIGHAND\fP が指定されていなかった。 (Linux 2.5.35 以降)
484 .TP 
485 \fBEINVAL\fP
486 .\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71
487 \fBCLONE_FS\fP と \fBCLONE_NEWNS\fP の両方が \fIflags\fP に指定された。
488 .TP 
489 \fBEINVAL\fP (Linux 3.9 以降)
490 \fBCLONE_NEWUSER\fP と \fBCLONE_FS\fP の両方が \fIflags\fP に指定された。
491 .TP 
492 \fBEINVAL\fP
493 \fBCLONE_NEWIPC\fP と \fBCLONE_SYSVSEM\fP の両方が \fIflags\fP に指定された。
494 .TP 
495 \fBEINVAL\fP
496 \fBCLONE_NEWPID\fP と \fBCLONE_NEWUSER\fP の一方 (もしくは両方) と、 \fBCLONE_THREAD\fP と
497 \fBCLONE_PARENT\fP  の一方 (もしくは両方) が、 \fIflags\fP に指定された。
498 .TP 
499 \fBEINVAL\fP
500 \fIchild_stack\fP にゼロを指定した場合に \fBclone\fP()  が返す。
501 .TP 
502 \fBEINVAL\fP
503 \fIflags\fP に \fBCLONE_NEWIPC\fP が指定されたが、カーネルでオプション \fBCONFIG_SYSVIPC\fP と
504 \fBCONFIG_IPC_NS\fP が有効になっていなかった。
505 .TP 
506 \fBEINVAL\fP
507 \fIflags\fP に \fBCLONE_NEWNET\fP が指定されたが、カーネルでオプション \fBCONFIG_NET_NS\fP が有効になっていなかった。
508 .TP 
509 \fBEINVAL\fP
510 \fIflags\fP に \fBCLONE_NEWPID\fP が指定されたが、カーネルでオプション \fBCONFIG_PID_NS\fP が有効になっていなかった。
511 .TP 
512 \fBEINVAL\fP
513 \fIflags\fP に \fBCLONE_NEWUTS\fP が指定されたが、カーネルでオプション \fBCONFIG_UTS\fP が有効になっていなかった。
514 .TP 
515 \fBENOMEM\fP
516 子プロセスのために確保すべきタスク構造体や、呼び出し元のコンテキストの 一部をコピーするのに必要なメモリを十分に割り当てることができない。
517 .TP 
518 \fBEPERM\fP
519 非特権プロセス (\fBCAP_SYS_ADMIN\fP を持たないプロセス) が \fBCLONE_NEWIPC\fP, \fBCLONE_NEWNET\fP,
520 \fBCLONE_NEWNS\fP, \fBCLONE_NEWPID\fP, \fBCLONE_NEWUTS\fP を指定した。
521 .TP 
522 \fBEPERM\fP
523 PID が 0 以外のプロセスによって \fBCLONE_PID\fP が指定された。
524 .TP 
525 \fBEPERM\fP
526 \fBCLONE_NEWUSER\fP が \fIflags\fP に指定されたが、 呼び出し元の実効ユーザー ID もしくは実効グループ ID
527 が親名前空間にマッピングがない (\fBuser_namespaces\fP(7) 参照)。
528 .TP 
529 \fBEPERM\fP (Linux 3.9 以降)
530 .\" commit 3151527ee007b73a0ebd296010f1c0454a919c7d
531 .\" FIXME What is the rationale for this restriction?
532 \fBCLONE_NEWUSER\fP が \fIflags\fP に指定され、 呼び出し元が chroot された環境にいる (すなわち、呼び出し元の root
533 ディレクトリが呼び出し元が属するマウント名前空間の root ディレクトリに一致しない)。
534 .TP 
535 \fBEUSERS\fP (Linux 3.11 以降)
536 \fBCLONE_NEWUSER\fP が \fIflags\fP に指定されており、 この呼び出しによりネストされたユーザー名前空間数の上限を超えてしまう。
537 \fBuser_namespaces\fP(7) を参照。
538 .SH バージョン
539 libc5 には \fBclone\fP()  はない。glibc2 では \fBclone\fP()  が提供されており、このマニュアルページに記載の通りである。
540 .SH 準拠
541 \fBclone\fP() は Linux 特有であり、移植を考慮したプログラムでは使用すべき ではない。
542 .SH 注意
543 カーネル 2.4.x 系列では、一般的には \fBCLONE_THREAD\fP フラグを指定しても新しいスレッドの親を
544 呼び出し元プロセスの親と同じにはしない。 しかし、バージョン 2.4.7〜2.4.18 のカーネルでは、 (カーネル 2.6 と同じように)
545 CLONE_THREAD フラグを指定すると、 暗黙のうちに CLONE_PARENT フラグを指定したことになる。
546
547 \fBCLONE_DETACHED\fP というフラグが、2.5.32 で導入されて以来しばらくの間存在した。
548 このフラグは親プロセスが子プロセス終了のシグナルを必要としないことを 表すものである。 2.6.2 で、 CLONE_DETATCHED を
549 CLONE_THREAD と一緒に指定する必要はなくなった。 このフラグはまだ定義されているが、何の効果もない。
550
551 i386 上では、 \fBclone\fP()  は vsyscall 経由ではなく、直接 \fIint $0x80\fP 経由で呼び出すべきである。
552 .SH バグ
553 NPTL スレッドライブラリを含んでいる GNU C ライブラリのいくつかのバージョン には、 \fBgetpid\fP(2)
554 のラッパー関数が含まれており、このラッパー関数は PID をキャッシュする。 このキャッシュ処理が正しく動作するためには glibc の
555 \fBclone\fP()  のラッパー関数での助けが必要だが、現状の実装では、 ある状況下においてキャッシュが最新とならない可能性がある。 特に、
556 \fBclone\fP()  の呼び出し直後にシグナルが子プロセスに配送された場合に、 そのシグナルに対するハンドラ内で \fBgetpid\fP(2)
557 を呼び出すと、それまでに clone のラッパー関数が子プロセスの PID キャッシュを 更新する機会が得られていなければ、呼び出し元プロセス
558 ("親プロセス") の PID が 返される可能性がある。 (この議論では、子プロセスが \fBCLONE_THREAD\fP
559 を使って作成された場合のことは無視している。 子プロセスが \fBCLONE_THREAD\fP を作って作成された場合には、
560 呼び出し元と子プロセスは同じスレッドグループに属すので、 \fBgetpid\fP(2)  は子プロセスと \fBclone\fP()
561 を呼び出したプロセスで同じ値を返すのが「正しい」。 キャッシュが最新とならない問題 (stale\-cache problem) は、 \fIflags\fP
562 に \fBCLONE_VM\fP が含まれている場合にも発生しない。)  本当の値を得るためには、次のようなコードを使う必要があるかもしれない。
563 .nf
564
565     #include <syscall.h>
566
567     pid_t mypid;
568
569     mypid = syscall(SYS_getpid);
570 .fi
571 .\" See also the following bug reports
572 .\" https://bugzilla.redhat.com/show_bug.cgi?id=417521
573 .\" http://sourceware.org/bugzilla/show_bug.cgi?id=6910
574 .SH 例
575 以下のプログラムは、 別の UTS 名前空間で動作する子プロセスを \fBclone\fP() を使って作成する例である。 子プロセスは、自分の UTS
576 名前空間においてホスト名を変更する。 それから、親プロセスと子プロセスの両方でシステムのホスト名を表示し、 親プロセスと子プロセスの UTS
577 名前空間でホスト名が異なることを確認する。 このプログラムの使用方法については \fBsetns\fP(2) を参照。
578 .SS プログラムのソース
579 .nf
580 #define _GNU_SOURCE
581 #include <sys/wait.h>
582 #include <sys/utsname.h>
583 #include <sched.h>
584 #include <string.h>
585 #include <stdio.h>
586 #include <stdlib.h>
587 #include <unistd.h>
588
589 #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \e
590                         } while (0)
591
592 static int              /* clone された子プロセスの開始関数 */
593 childFunc(void *arg)
594 {
595     struct utsname uts;
596
597     /* 子プロセスの UTS 名前空間でホスト名を変更する */
598
599     if (sethostname(arg, strlen(arg)) == \-1)
600         errExit("sethostname");
601
602     /* ホスト名を取得し表示する */
603
604     if (uname(&uts) == \-1)
605         errExit("uname");
606     printf("uts.nodename in child:  %s\en", uts.nodename);
607
608     /* sleep を使ってしばらく名前空間をオープンされたままにする。
609        これにより実験を行うことができる \-\- 例えば、
610        別のプロセスがこの名前空間に参加するなど。 */
611
612     sleep(200);
613
614     return 0;           /* 子プロセスを終了する */
615 }
616
617 #define STACK_SIZE (1024 * 1024)    /* clone される子プロセスのスタックサイズ */
618
619 int
620 main(int argc, char *argv[])
621 {
622     char *stack;                    /* スタックバッファの先頭 */
623     char *stackTop;                 /* スタックバッファの末尾 */
624     pid_t pid;
625     struct utsname uts;
626
627     if (argc < 2) {
628         fprintf(stderr, "Usage: %s <child\-hostname>\en", argv[0]);
629         exit(EXIT_SUCCESS);
630     }
631
632     /* 子プロセス用のスタックを割り当てる */
633
634     stack = malloc(STACK_SIZE);
635     if (stack == NULL)
636         errExit("malloc");
637     stackTop = stack + STACK_SIZE;  /* スタックは下方向に伸びるものとする */
638
639     /* 自分専用の UTS 名前空間を持つ子プロセスを作成する;
640        子プロセスは childFunc() の実行を開始する */
641
642     pid = clone(childFunc, stackTop, CLONE_NEWUTS | SIGCHLD, argv[1]);
643     if (pid == \-1)
644         errExit("clone");
645     printf("clone() returned %ld\en", (long) pid);
646
647     /* 親プロセスの実行はここに来る */
648
649     sleep(1);           /* 子プロセスがホスト名を変更する時間を与える */
650
651     /* 親プロセスの UTS 名前空間でのホスト名を表示する;
652        これは子プロセスの UTS 名前空間でのホスト名とは異なる */
653
654     if (uname(&uts) == \-1)
655         errExit("uname");
656     printf("uts.nodename in parent: %s\en", uts.nodename);
657
658     if (waitpid(pid, NULL, 0) == \-1)    /* 子プロセスを待つ */
659         errExit("waitpid");
660     printf("child has terminated\en");
661
662     exit(EXIT_SUCCESS);
663 }
664 .fi
665 .SH 関連項目
666 \fBfork\fP(2), \fBfutex\fP(2), \fBgetpid\fP(2), \fBgettid\fP(2), \fBkcmp\fP(2),
667 \fBset_thread_area\fP(2), \fBset_tid_address\fP(2), \fBsetns\fP(2), \fBtkill\fP(2),
668 \fBunshare\fP(2), \fBwait\fP(2), \fBcapabilities\fP(7), \fBnamespaces\fP(7),
669 \fBpthreads\fP(7)
670 .SH この文書について
671 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.78 の一部
672 である。プロジェクトの説明とバグ報告に関する情報は
673 http://www.kernel.org/doc/man\-pages/ に書かれている。