-.\" Hey Emacs! This file is -*- nroff -*- source.
-.\"
.\" Copyright (c) 1992 Drew Eckhardt <drew@cs.colorado.edu>, March 28, 1992
-.\" and Copyright (c) Michael Kerrisk, 2001, 2002, 2005
+.\" and Copyright (c) Michael Kerrisk, 2001, 2002, 2005, 2013
+.\"
+.\" %%%LICENSE_START(GPL_NOVERSION_ONELINE)
.\" May be distributed under the GNU General Public License.
+.\" %%%LICENSE_END
+.\"
.\" Modified by Michael Haardt <michael@moria.de>
.\" Modified 24 Jul 1993 by Rik Faith <faith@cs.unc.edu>
.\" Modified 21 Aug 1994 by Michael Chastain <mec@shell.portal.com>:
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
-.TH CLONE 2 2011\-09\-08 Linux "Linux Programmer's Manual"
+.TH CLONE 2 2013\-01\-01 Linux "Linux Programmer's Manual"
.SH 名前
clone, __clone2 \- 子プロセスを作成する
.SH 書式
\fBclone\fP() の主要な使用法はスレッド (threads) を実装することである:
一つのプログラムの中の複数のスレッドは共有されたメモリ空間で 同時に実行される。
-\fBclone\fP() で子プロセスが作成された時に、作成された子プロセスは関数 \fIfn\fP(\fIarg\fP) を実行する。 (この点が
-\fBfork\fP(2) とは異なる。 \fBfork\fP(2) の場合、子プロセスは \fBfork\fP(2) が呼び出された場所から実行を続ける。)
-\fIfn\fP 引き数は、子プロセスが実行を始める時に子プロセスが呼び出す 関数へのポインタである。 \fIarg\fP 引き数はそのまま \fIfn\fP
-関数へと渡される。
+When the child process is created with \fBclone\fP(), it executes the function
+\fIfn\fP(\fIarg\fP). (This differs from \fBfork\fP(2), where execution continues in
+the child from the point of the \fBfork\fP(2) call.) The \fIfn\fP argument is a
+pointer to a function that is called by the child process at the beginning
+of its execution. The \fIarg\fP argument is passed to the \fIfn\fP function.
\fIfn\fP(\fIarg\fP) 関数が終了すると、子プロセスは終了する。 \fIfn\fP によって返された整数が子プロセスの終了コードとなる。 子プロセスは、
\fBexit\fP(2) を呼んで明示的に終了することもあるし、致命的なシグナルを受信した 場合に終了することもある。
\fBCLONE_CHILD_SETTID\fP (Linux 2.5.49 以降)
子プロセスのメモリ内の \fIctid\fP が指す場所に子プロセスのスレッド ID を格納する。
.TP
-\fBCLONE_FILES\fP
+\fBCLONE_FILES\fP (since Linux 2.0)
\fBCLONE_FILES\fP が設定された場合、呼び出し元のプロセスと子プロセスはファイルディスクリプタの テーブルを共有する。
呼び出し元プロセスとその子プロセスの一方が作成した ファイルディスクリプタは、もう一方においても有効である。
同じように、一方のプロセスがファイルディスクリプタを閉じたり、 (\fBfcntl\fP(2) \fBF_SETFD\fP 操作を使って)
参照) を参照する)。 これ以降に、呼び出し元のプロセスと子プロセスの一方が ファイルディスクリプタの操作 (ファイルディスクリプタの
オープン・クローズや、ファイルディスクリプタ・フラグの変更) を行っても、もう一方のプロセスには影響を与えない。
.TP
-\fBCLONE_FS\fP
+\fBCLONE_FS\fP (since Linux 2.0)
\fBCLONE_FS\fP が設定された場合、呼び出し元のプロセスと子プロセスが同じファイル・システム
情報を共有する。ファイル・システム情報は、ファイル・システムのルート (root)、 カレント・ワーキング・ディレクトリ (current
working directory) や umask などである。 呼び出し元のプロセスや子プロセスのどちらか一方によって \fBchroot\fP(2),
このフラグが設定されていない場合、 (\fBfork\fP(2) の場合と同様) 呼び出し元のプロセスと同じ IPC 名前空間でプロセスが 作成される。
このフラグは、コンテナの実装での使用を意図して用意されたものである。
-IPC 名前空間は、System V IPC オブジェクト用の識別子 (identifiers) の 集合で構成される (System V IPC
-オブジェクトは \fBmsgctl\fP(2), \fBsemctl\fP(2), \fBshmctl\fP(2) を使って作成される)。 ある IPC
-名前空間に作成されたオブジェクトは、 その名前空間のメンバーである他のすべてのプロセスからも見えるが、 違う IPC 名前空間のプロセスからは見えない。
+.\" commit 7eafd7c74c3f2e67c27621b987b28397110d643f
+.\" https://lwn.net/Articles/312232/
+An IPC namespace provides an isolated view of System V IPC objects (see
+\fBsvipc\fP(7)) and (since Linux 2.6.30) POSIX message queues (see
+\fBmq_overview\fP(7)). The common characteristic of these IPC mechanisms is
+that IPC objects are identified by mechanisms other than filesystem
+pathnames.
+
+Objects created in an IPC namespace are visible to all other processes that
+are members of that namespace, but are not visible to processes in other IPC
+namespaces.
IPC 名前空間が破棄される時 (すなわち、その名前空間のメンバーの最後のプロセスが終了する時)、 その名前空間の全ての IPC
オブジェクトは自動的に破棄される。
このフラグが設定されていない場合、 (\fBfork\fP(2) の場合と同様) 呼び出し元のプロセスと同じネットワーク名前空間でプロセスが 作成される。
このフラグは、コンテナの実装での使用を意図して用意されたものである。
+.\" FIXME Add pointer to veth(4) page when it is eventually completed
ネットワーク名前空間は、分離されたネットワークスタックを提供するものである (ネットワークスタックとは、 ネットワークデバイスインタフェース、IPv4
や IPv6 プロトコルスタック、 \fI/proc/net\fP、 \fI/sys/class/net\fP ディレクトリツリー、ソケットなどである)。
物理ネットワークデバイスが所属できるネットワーク名前空間は一つだけである。 仮想ネットワークデバイス ("veth") のペアにより パイプ風の抽象化
で作成される。これはシステムをハッキングするのには便利だが、 それ以外にはあまり使われない。 Linux 2.3.21 以降では、
システムのブートプロセス (PID 0) だけがこのフラグを指定できる。 Linux 2.5.16 で削除された。
.TP
-\fBCLONE_PTRACE\fP
+\fBCLONE_PTRACE\fP (Linux 2.2 以降)
\fBCLONE_PTRACE\fP が指定され、かつ呼び出し元のプロセスが追跡 (trace) されていた場合、子プロセスも 同様に追跡される。
(\fBptrace\fP(2) を参照のこと)
.TP
\fInewtls\fP 引き数は、新しい TLS (Thread Local Storage) ディスクリプタである。
(\fBset_thread_area\fP(2) を参照のこと)
.TP
-\fBCLONE_SIGHAND\fP
+\fBCLONE_SIGHAND\fP (Linux 2.0 以降)
\fBCLONE_SIGHAND\fP が設定された場合、呼び出し元のプロセスと子プロセスは同じシグナル・ハン
ドラのテーブルを共有する。呼び出し元のプロセスまたは子プロセスのどちらかが \fBsigaction\fP(2)
を呼び出してシグナルに対応する動作を変更した場合、 もう一方のプロセスのシグナル動作も変更される。 但し、呼び出し元のプロセスと子プロセスは、
\fBCLONE_UNTRACED\fP が指定されると、 trace を行っているプロセスは この子プロセスに \fBCLONE_PTRACE\fP
を適用することができない。
.TP
-\fBCLONE_VFORK\fP
+\fBCLONE_VFORK\fP (Linux 2.2 以降)
\fBCLONE_VFORK\fP が設定された場合、 (\fBvfork\fP(2) と同様に) 子プロセスが \fBexecve\fP(2) または
\fB_exit\fP(2) によって仮想メモリを解放するまで、呼び出し元のプロセスの実行は停止される。
\fBCLONE_VFORK\fP が設定されていない場合、 \fBclone\fP() 呼び出し後は、呼び出し元のプロセスと子プロセスの
両方がスケジュール対象となり、アプリケーションはこれらのプロセスの 実行順序に依存しないようにすべきである。
.TP
-\fBCLONE_VM\fP
+\fBCLONE_VM\fP (Linux 2.0 以降)
\fBCLONE_VM\fP が設定された場合、呼び出し元のプロセスと子プロセスは同じメモリ空間で
実行される。特に、呼び出し元のプロセスや子プロセスの一方がメモリに 書き込んだ内容はもう一方のプロセスからも見ることができる。さらに、
子プロセスや呼び出し元のプロセスの一方が \fBmmap\fP(2) や \fBmunmap\fP(2) を使ってメモリをマップしたりアンマップした場合、
別のメモリ空間で実行される。 一方のプロセスが行ったメモリへの書き込みや ファイルのマップ/アンマップは、 \fBfork\fP(2)
の場合と同様、もう一方のプロセスには影響しない。
.SS sys_clone
-\fBsys_clone\fP システムコールは、より \fBfork\fP(2) に近いかたちになっており、子プロセスの実行が呼び出しが行われた場所から
-続けられる。 そのため、 \fBsys_clone\fP が必要とする引き数は \fIflags\fP と \fIchild_stack\fP だけであり、それらは
-\fBclone\fP() と同じ意味を持つ (これらの引き数の順番は \fBclone\fP() とは異なることに注意せよ)。
+The \fBsys_clone\fP system call corresponds more closely to \fBfork\fP(2) in that
+execution in the child continues from the point of the call. As such, the
+\fIfn\fP and \fIarg\fP arguments of the \fBclone\fP() wrapper function are omitted.
+Furthermore, the argument order changes. The raw system call interface is
+roughly:
+.in +4
+.nf
+\fBlong clone(unsigned long \fP\fIflags\fP\fB, void *\fP\fIchild_stack\fP\fB,\fP
+\fB void *\fP\fIptid\fP\fB, void *\fP\fIctid\fP\fB,\fP
+\fB struct pt_regs *\fP\fIregs\fP\fB);\fP
+
+.fi
+.in
\fBsys_clone\fP のもう一つの違いは、 \fIchild_stack\fP 引き数がゼロでも良いことである。この場合には、どちらかのプロセスが
スタックを変更した時に、書き込み時コピー (copy\-on\-write) 方式により
子プロセスがスタック・ページの独立したコピーを得られることが保証される。 この場合、正常に動作させるためには、 \fBCLONE_VM\fP
オプションを指定してはならない。
-
+.SS "Linux 2.4 and earlier"
Linux 2.4 以前では、 \fBclone\fP() は引き数 \fIptid\fP, \fItls\fP, \fIctid\fP を取らない。
.SH 返り値
.\" gettid(2) returns current->pid;
.\" See also the following bug reports
.\" https://bugzilla.redhat.com/show_bug.cgi?id=417521
.\" http://sourceware.org/bugzilla/show_bug.cgi?id=6910
+.SH EXAMPLE
+.SS "Create a child that executes in a separate UTS namespace"
+The following program demonstrates the use of \fBclone\fP() to create a child
+process that executes in a separate UTS namespace. The child changes the
+hostname in its UTS namespace. Both parent and child then display the
+system hostname, making it possible to see that the hostname differs in the
+UTS namespaces of the parent and child. For an example of the use of this
+program, see \fBsetns\fP(2).
+
+.nf
+#define _GNU_SOURCE
+#include <sys/wait.h>
+#include <sys/utsname.h>
+#include <sched.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \e
+ } while (0)
+
+static int /* Start function for cloned child */
+childFunc(void *arg)
+{
+ struct utsname uts;
+
+ /* Change hostname in UTS namespace of child */
+
+ if (sethostname(arg, strlen(arg)) == \-1)
+ errExit("sethostname");
+
+ /* Retrieve and display hostname */
+
+ if (uname(&uts) == \-1)
+ errExit("uname");
+ printf("uts.nodename in child: %s\en", uts.nodename);
+
+ /* Keep the namespace open for a while, by sleeping.
+ This allows some experimentation\-\-for example, another
+ process might join the namespace. */
+
+ sleep(200);
+
+ return 0; /* Child terminates now */
+}
+
+#define STACK_SIZE (1024 * 1024) /* Stack size for cloned child */
+
+int
+main(int argc, char *argv[])
+{
+ char *stack; /* Start of stack buffer */
+ char *stackTop; /* End of stack buffer */
+ pid_t pid;
+ struct utsname uts;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s <child\-hostname>\en", argv[0]);
+ exit(EXIT_SUCCESS);
+ }
+
+ /* Allocate stack for child */
+
+ stack = malloc(STACK_SIZE);
+ if (stack == NULL)
+ errExit("malloc");
+ stackTop = stack + STACK_SIZE; /* Assume stack grows downward */
+
+ /* Create child that has its own UTS namespace;
+ child commences execution in childFunc() */
+
+ pid = clone(childFunc, stackTop, CLONE_NEWUTS | SIGCHLD, argv[1]);
+ if (pid == \-1)
+ errExit("clone");
+ printf("clone() returned %ld\en", (long) pid);
+
+ /* Parent falls through to here */
+
+ sleep(1); /* Give child time to change its hostname */
+
+ /* Display hostname in parent\(aqs UTS namespace. This will be
+ different from hostname in child\(aqs UTS namespace. */
+
+ if (uname(&uts) == \-1)
+ errExit("uname");
+ printf("uts.nodename in parent: %s\en", uts.nodename);
+
+ if (waitpid(pid, NULL, 0) == \-1) /* Wait for child */
+ errExit("waitpid");
+ printf("child has terminated\en");
+
+ exit(EXIT_SUCCESS);
+}
+.fi
.SH 関連項目
-\fBfork\fP(2), \fBfutex\fP(2), \fBgetpid\fP(2), \fBgettid\fP(2), \fBset_thread_area\fP(2),
-\fBset_tid_address\fP(2), \fBtkill\fP(2), \fBunshare\fP(2), \fBwait\fP(2),
-\fBcapabilities\fP(7), \fBpthreads\fP(7)
+\fBfork\fP(2), \fBfutex\fP(2), \fBgetpid\fP(2), \fBgettid\fP(2), \fBkcmp\fP(2),
+\fBset_thread_area\fP(2), \fBset_tid_address\fP(2), \fBsetns\fP(2), \fBtkill\fP(2),
+\fBunshare\fP(2), \fBwait\fP(2), \fBcapabilities\fP(7), \fBpthreads\fP(7)
.SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.41 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.50 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。