.\" Updated 2012-05-08, Akihiro MOTOKI <amotoki@gmail.com>
.\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
.\"
.\" Updated 2012-05-08, Akihiro MOTOKI <amotoki@gmail.com>
.\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
.\"
メインの説明はラッパー関数に関するものである。 素のシステムコールにおける差分はこのページの最後の方で説明する。
\fBfork\fP(2) とは異なり、\fBclone\fP() では、子プロセス (child process)
メインの説明はラッパー関数に関するものである。 素のシステムコールにおける差分はこのページの最後の方で説明する。
\fBfork\fP(2) とは異なり、\fBclone\fP() では、子プロセス (child process)
(このマニュアルにおける「呼び出し元のプロセス」は、通常は 「親プロセス」と一致する。但し、後述の \fBCLONE_PARENT\fP の項も参照のこと)
\fBclone\fP() の主要な使用法はスレッド (threads) を実装することである:
(このマニュアルにおける「呼び出し元のプロセス」は、通常は 「親プロセス」と一致する。但し、後述の \fBCLONE_PARENT\fP の項も参照のこと)
\fBclone\fP() の主要な使用法はスレッド (threads) を実装することである:
-\fBCLONE_FS\fP ã\81\8cè¨å®\9aã\81\95ã\82\8cã\81\9få ´å\90\88ã\80\81å\91¼ã\81³å\87ºã\81\97å\85\83ã\81®ã\83\97ã\83ã\82»ã\82¹ã\81¨å\90ã\83\97ã\83ã\82»ã\82¹ã\81\8cå\90\8cã\81\98ã\83\95ã\82¡ã\82¤ã\83«ã\83»ã\82·ã\82¹ã\83\86ã\83
-æ\83\85å ±ã\82\92å\85±æ\9c\89ã\81\99ã\82\8bã\80\82ã\83\95ã\82¡ã\82¤ã\83«ã\83»ã\82·ã\82¹ã\83\86ã\83 æ\83\85å ±ã\81¯ã\80\81ã\83\95ã\82¡ã\82¤ã\83«ã\83»ã\82·ã\82¹ã\83\86ã\83 ã\81®ã\83«ã\83¼ã\83\88 (root)ã\80\81 ã\82«ã\83¬ã\83³ã\83\88ã\83»ã\83¯ã\83¼ã\82ã\83³ã\82°ã\83»ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ª (current
-working directory) や umask などである。 呼び出し元のプロセスや子プロセスのどちらか一方によって \fBchroot\fP(2),
+\fBCLONE_FS\fP が設定された場合、呼び出し元のプロセスと子プロセスが同じファイルシステム
+æ\83\85å ±ã\82\92å\85±æ\9c\89ã\81\99ã\82\8bã\80\82ã\83\95ã\82¡ã\82¤ã\83«ã\82·ã\82¹ã\83\86ã\83 æ\83\85å ±ã\81¯ã\80\81ã\83\95ã\82¡ã\82¤ã\83«ã\82·ã\82¹ã\83\86ã\83 ã\81®ã\83«ã\83¼ã\83\88 (root)ã\80\81 ã\82«ã\83¬ã\83³ã\83\88ã\83¯ã\83¼ã\82ã\83³ã\82°ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ª (current working
+directory) や umask などである。 呼び出し元のプロセスや子プロセスのどちらか一方によって \fBchroot\fP(2),
\fBchdir\fP(2), \fBumask\fP(2) が呼び出されると、もう一方のプロセスにも影響が及ぶ。
\fBCLONE_FS\fP が設定されていない場合、子プロセスは、 \fBclone\fP()
\fBchdir\fP(2), \fBumask\fP(2) が呼び出されると、もう一方のプロセスにも影響が及ぶ。
\fBCLONE_FS\fP が設定されていない場合、子プロセスは、 \fBclone\fP()
\fBchroot\fP(2), \fBchdir\fP(2), \fBumask\fP(2) を呼び出しても、もう一方のプロセスには影響を与えない。
.TP
\fBCLONE_IO\fP (Linux 2.6.25 以降)
\fBchroot\fP(2), \fBchdir\fP(2), \fBumask\fP(2) を呼び出しても、もう一方のプロセスには影響を与えない。
.TP
\fBCLONE_IO\fP (Linux 2.6.25 以降)
以降では) 独立した POSIX メッセージキュー空間 (\fBmq_overview\fP(7) 参照) も提供される。 これらの IPC
機構に共通の特徴として、 IPC オブジェクトはファイルシステムのパス名とは違った仕組みで識別されるという点がある。
以降では) 独立した POSIX メッセージキュー空間 (\fBmq_overview\fP(7) 参照) も提供される。 これらの IPC
機構に共通の特徴として、 IPC オブジェクトはファイルシステムのパス名とは違った仕組みで識別されるという点がある。
ドラのテーブルを共有する。呼び出し元のプロセスまたは子プロセスのどちらかが \fBsigaction\fP(2)
を呼び出してシグナルに対応する動作を変更した場合、 もう一方のプロセスのシグナル動作も変更される。 但し、呼び出し元のプロセスと子プロセスは、
ドラのテーブルを共有する。呼び出し元のプロセスまたは子プロセスのどちらかが \fBsigaction\fP(2)
を呼び出してシグナルに対応する動作を変更した場合、 もう一方のプロセスのシグナル動作も変更される。 但し、呼び出し元のプロセスと子プロセスは、
\fBsigprocmask\fP(2) を使用して、もう一方のプロセスに影響を与えずに シグナルを禁止 (block) したり許可 (unblock)
したりできる。
\fBCLONE_SIGHAND\fP が設定されていない場合、子プロセスは \fBclone\fP()
\fBsigprocmask\fP(2) を使用して、もう一方のプロセスに影響を与えずに シグナルを禁止 (block) したり許可 (unblock)
したりできる。
\fBCLONE_SIGHAND\fP が設定されていない場合、子プロセスは \fBclone\fP()
を呼び出しても、もう一方のプロセスには影響を与えない。
Linux 2.6.0\-test6 以降では、 \fBCLONE_SIGHAND\fP を指定する場合、 \fBCLONE_VM\fP も \fIflags\fP
を呼び出しても、もう一方のプロセスには影響を与えない。
Linux 2.6.0\-test6 以降では、 \fBCLONE_SIGHAND\fP を指定する場合、 \fBCLONE_VM\fP も \fIflags\fP
(\fBsemop\fP(2) 参照) を共有する。このフラグがセットされていなければ、 子プロセスは独自のアンドゥリストを持つ
(リストの初期値は空である)。
.TP
\fBCLONE_THREAD\fP (Linux 2.4.0\-test8以降)
(\fBsemop\fP(2) 参照) を共有する。このフラグがセットされていなければ、 子プロセスは独自のアンドゥリストを持つ
(リストの初期値は空である)。
.TP
\fBCLONE_THREAD\fP (Linux 2.4.0\-test8以降)
-\fBCLONE_THREAD\fP ã\81\8cè¨å®\9aã\81\95ã\82\8cã\81\9få ´å\90\88ã\80\81å\90ã\83\97ã\83ã\82»ã\82¹ã\81¯å\91¼ã\81³å\87ºã\81\97å\85\83ã\81®ã\83\97ã\83ã\82»ã\82¹ã\81¨å\90\8cã\81\98ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\81« ç½®ã\81\8bã\82\8cã\82\8bã\80\82 \fBCLONE_THREAD\fP
-ã\81«ã\81¤ã\81\84ã\81¦ã\81®ä»¥é\99\8dã\81®è°è«\96ã\82\92èªã\81¿ã\82\84ã\81\99ã\81\8fã\81\99ã\82\8bã\81\9fã\82\81ã\80\81 ã\80\8cã\82¹ã\83¬ã\83\83ã\83\89ã\80\8dã\81¨ã\81\84ã\81\86ç\94¨èª\9eã\81¯ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\81®ä¸ã\81®ã\83\97ã\83ã\82»ã\82¹ã\82\92 å\8f\82ç\85§ã\81\99ã\82\8bã\81®ã\81«ä½¿ã\81\86ã\81\93ã\81¨ã\81¨ã\81\99ã\82\8bã\80\82
+\fBCLONE_THREAD\fP が設定された場合、子プロセスは呼び出し元のプロセスと同じスレッドグループに 置かれる。 \fBCLONE_THREAD\fP
+についての以降の議論を読みやすくするため、 「スレッド」という用語はスレッドグループの中のプロセスを 参照するのに使うこととする。
-ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\81¯ã\80\81 ã\82¹ã\83¬ã\83\83ã\83\89é\9b\86å\90\88ã\81§ä¸\80ã\81¤ã\81® PID ã\82\92å\85±æ\9c\89ã\81\99ã\82\8bã\81¨ã\81\84ã\81\86 POSIX ã\82¹ã\83¬ã\83\83ã\83\89ã\81®æ¦\82念ã\82\92ã\82µã\83\9dã\83¼ã\83\88ã\81\99ã\82\8bã\81\9fã\82\81ã\81« Linux 2.4
-ã\81«å\8a ã\81\88ã\82\89ã\82\8cã\81\9fæ©\9fè\83½ã\81§ã\81\82ã\81£ã\81\9fã\80\82 å\86\85é\83¨ç\9a\84ã\81«ã\81¯ã\80\81ã\81\93ã\81®å\85±æ\9c\89 PID ã\81¯ã\81\84ã\82\8fã\82\86ã\82\8bã\81\9dã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\82°ã\83«ã\83¼ã\83\97ã\81® ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97è\98å\88¥å\90 (TGID) ã\81§ã\81\82ã\82\8bã\80\82 Linux
-2.4 以é\99\8dã\81§ã\81¯ã\80\81 \fBgetpid\fP(2) ã\81®å\91¼ã\81³å\87ºã\81\97ã\81§ã\81¯ã\81\9dã\81®ã\83\97ã\83ã\82»ã\82¹ã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97 ID ã\82\92è¿\94ã\81\99ã\80\82
+スレッドグループは、 スレッド集合で一つの PID を共有するという POSIX スレッドの概念をサポートするために Linux 2.4
+に加えられた機能であった。 内部的には、この共有 PID はいわゆるそのスレッドグループの スレッドグループ識別子 (TGID) である。 Linux
+2.4 以降では、 \fBgetpid\fP(2) の呼び出しではそのプロセスのスレッドグループ ID を返す。
あるグループに属するスレッドは (システム全体で) 一意なスレッド ID (TID) で区別できる。新しいスレッドの TID は \fBclone\fP()
の呼び出し元へ関数の結果として返され、 スレッドは自分自身の TID を \fBgettid\fP(2) で取得できる。
\fBCLONE_THREAD\fP を指定せずに \fBclone\fP() の呼び出しが行われると、 生成されたスレッドはそのスレッドの TID と同じ値の
あるグループに属するスレッドは (システム全体で) 一意なスレッド ID (TID) で区別できる。新しいスレッドの TID は \fBclone\fP()
の呼び出し元へ関数の結果として返され、 スレッドは自分自身の TID を \fBgettid\fP(2) で取得できる。
\fBCLONE_THREAD\fP を指定せずに \fBclone\fP() の呼び出しが行われると、 生成されたスレッドはそのスレッドの TID と同じ値の
\fBCLONE_THREAD\fP で作られたスレッドが終了した際に、 そのスレッドを \fBclone\fP() を使って生成したスレッドには
\fBSIGCHLD\fP (もしくは他の終了シグナル) は送信されない。 また、 \fBwait\fP(2)
を使って終了したスレッドの状態を取得することもできない (そのようなスレッドは \fIdetached\fP (分離された) といわれる)。
\fBCLONE_THREAD\fP で作られたスレッドが終了した際に、 そのスレッドを \fBclone\fP() を使って生成したスレッドには
\fBSIGCHLD\fP (もしくは他の終了シグナル) は送信されない。 また、 \fBwait\fP(2)
を使って終了したスレッドの状態を取得することもできない (そのようなスレッドは \fIdetached\fP (分離された) といわれる)。
-ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\81«å±\9eã\81\99ã\81\84ã\81\9aã\82\8cã\81\8bã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\81\8c \fBexecve\fP(2) ã\82\92å®\9fè¡\8cã\81\99ã\82\8bã\81¨ã\80\81ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\83»リーダー以外の全てのスレッドは
-çµ\82äº\86ã\81\95ã\82\8cã\80\81æ\96°ã\81\97ã\81\84ã\83\97ã\83ã\82»ã\82¹ã\81\8cã\81\9dã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\83»リーダーの下で 実行される。
+ã\82¹ã\83¬ã\83\83ã\83\89ã\82°ã\83«ã\83¼ã\83\97ã\81«å±\9eã\81\99ã\81\84ã\81\9aã\82\8cã\81\8bã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\81\8c \fBexecve\fP(2) ã\82\92å®\9fè¡\8cã\81\99ã\82\8bã\81¨ã\80\81ã\82¹ã\83¬ã\83\83ã\83\89ã\82°ã\83«ã\83¼ã\83\97リーダー以外の全てのスレッドは
+çµ\82äº\86ã\81\95ã\82\8cã\80\81æ\96°ã\81\97ã\81\84ã\83\97ã\83ã\82»ã\82¹ã\81\8cã\81\9dã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\82°ã\83«ã\83¼ã\83\97リーダーの下で 実行される。
-ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\81«å±\9eã\81\99ã\82¹ã\83¬ã\83\83ã\83\89ã\81®ä¸\80ã\81¤ã\81\8c \fBfork\fP(2) ã\82\92使ã\81£ã\81¦å\90ã\83\97ã\83ã\82»ã\82¹ã\82\92ä½\9cæ\88\90ã\81\97ã\81\9få ´å\90\88ã\80\81 ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\81®ã\81©ã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\81§ã\81\82ã\81£ã\81¦ã\82\82
-その子供を \fBwait\fP(2) できる。
+ã\82¹ã\83¬ã\83\83ã\83\89ã\82°ã\83«ã\83¼ã\83\97ã\81«å±\9eã\81\99ã\82¹ã\83¬ã\83\83ã\83\89ã\81®ä¸\80ã\81¤ã\81\8c \fBfork\fP(2) ã\82\92使ã\81£ã\81¦å\90ã\83\97ã\83ã\82»ã\82¹ã\82\92ä½\9cæ\88\90ã\81\97ã\81\9få ´å\90\88ã\80\81 ã\82¹ã\83¬ã\83\83ã\83\89ã\82°ã\83«ã\83¼ã\83\97ã\81®ã\81©ã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\81§ã\81\82ã\81£ã\81¦ã\82\82 ã\81\9dã\81®å\90ä¾\9bã\82\92
+\fBwait\fP(2) できる。
\fBtgkill\fP(2) で送信される個々のスレッドに対するものがありえる。 \fBsigpending\fP(2)
を呼び出すと、プロセス全体に対する処理待ちシグナルと呼び出し元の スレッドに対する処理待ちシグナルを結合したシグナル集合が返される。
\fBtgkill\fP(2) で送信される個々のスレッドに対するものがありえる。 \fBsigpending\fP(2)
を呼び出すと、プロセス全体に対する処理待ちシグナルと呼び出し元の スレッドに対する処理待ちシグナルを結合したシグナル集合が返される。
-\fBkill\fP(2) ã\82\92使ã\81£ã\81¦ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\81«ã\82·ã\82°ã\83\8aã\83«ã\81\8cé\80\81ã\82\89ã\82\8cã\81\9få ´å\90\88ã\81§ã\80\81 ã\81\9dã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\83»ã\82°ã\83«ã\83¼ã\83\97ã\81\8cã\81\9dã\81®ã\82·ã\82°ã\83\8aã\83«ã\81«å¯¾ã\81\99ã\82\8bã\82·ã\82°ã\83\8aã\83«ã\83»ハンドラが
-ç\99»é\8c²ã\81\95ã\82\8cã\81¦ã\81\84ã\81\9fã\81¨ã\81\8dã\81«ã\81¯ã\80\81ã\82·ã\82°ã\83\8aã\83«ã\83»ã\83\8fã\83³ã\83\89ã\83©ã\81¯ã\82¹ã\83¬ã\83\83ã\83\89ã\83»グループの メンバーのうち、ただ一つのスレッドでだけ起動される。ハンドラが
+\fBkill\fP(2) ã\82\92使ã\81£ã\81¦ã\82¹ã\83¬ã\83\83ã\83\89ã\82°ã\83«ã\83¼ã\83\97ã\81«ã\82·ã\82°ã\83\8aã\83«ã\81\8cé\80\81ã\82\89ã\82\8cã\81\9få ´å\90\88ã\81§ã\80\81 ã\81\9dã\81®ã\82¹ã\83¬ã\83\83ã\83\89ã\82°ã\83«ã\83¼ã\83\97ã\81\8cã\81\9dã\81®ã\82·ã\82°ã\83\8aã\83«ã\81«å¯¾ã\81\99ã\82\8bã\82·ã\82°ã\83\8aã\83«ハンドラが
+ç\99»é\8c²ã\81\95ã\82\8cã\81¦ã\81\84ã\81\9fã\81¨ã\81\8dã\81«ã\81¯ã\80\81ã\82·ã\82°ã\83\8aã\83«ã\83\8fã\83³ã\83\89ã\83©ã\81¯ã\82¹ã\83¬ã\83\83ã\83\89グループの メンバーのうち、ただ一つのスレッドでだけ起動される。ハンドラが
これらのスレッドの中から一つをカーネルが勝手に選択し、 そのスレッドが \fBkill (2)\fP を使って送信されたシグナルを受信する。
.TP
\fBCLONE_UNTRACED\fP (Linux 2.5.46 以降)
これらのスレッドの中から一つをカーネルが勝手に選択し、 そのスレッドが \fBkill (2)\fP を使って送信されたシグナルを受信する。
.TP
\fBCLONE_UNTRACED\fP (Linux 2.5.46 以降)
.in
生のシステムコールのもう一つの違いは、 \fIchild_stack\fP 引き数がゼロでも良いことである。この場合には、どちらかのプロセスが
スタックを変更した時に、書き込み時コピー (copy\-on\-write) 方式により
.in
生のシステムコールのもう一つの違いは、 \fIchild_stack\fP 引き数がゼロでも良いことである。この場合には、どちらかのプロセスが
スタックを変更した時に、書き込み時コピー (copy\-on\-write) 方式により
オプションを指定してはならない。
いくつかのアーキテクチャでは、システムコールの引き数の順序は上記とは異なっている。 microblaze, ARM, ARM 64, PA\-RISC,
オプションを指定してはならない。
いくつかのアーキテクチャでは、システムコールの引き数の順序は上記とは異なっている。 microblaze, ARM, ARM 64, PA\-RISC,
のラッパー関数が含まれており、このラッパー関数は PID をキャッシュする。 このキャッシュ処理が正しく動作するためには glibc の
\fBclone\fP() のラッパー関数での助けが必要だが、現状の実装では、 ある状況下においてキャッシュが最新とならない可能性がある。 特に、
\fBclone\fP() の呼び出し直後にシグナルが子プロセスに配送された場合に、 そのシグナルに対するハンドラ内で \fBgetpid\fP(2)
を呼び出すと、それまでに clone のラッパー関数が子プロセスの PID キャッシュを 更新する機会が得られていなければ、呼び出し元プロセス
("親プロセス") の PID が 返される可能性がある。 (この議論では、子プロセスが \fBCLONE_THREAD\fP
を使って作成された場合のことは無視している。 子プロセスが \fBCLONE_THREAD\fP を作って作成された場合には、
のラッパー関数が含まれており、このラッパー関数は PID をキャッシュする。 このキャッシュ処理が正しく動作するためには glibc の
\fBclone\fP() のラッパー関数での助けが必要だが、現状の実装では、 ある状況下においてキャッシュが最新とならない可能性がある。 特に、
\fBclone\fP() の呼び出し直後にシグナルが子プロセスに配送された場合に、 そのシグナルに対するハンドラ内で \fBgetpid\fP(2)
を呼び出すと、それまでに clone のラッパー関数が子プロセスの PID キャッシュを 更新する機会が得られていなければ、呼び出し元プロセス
("親プロセス") の PID が 返される可能性がある。 (この議論では、子プロセスが \fBCLONE_THREAD\fP
を使って作成された場合のことは無視している。 子プロセスが \fBCLONE_THREAD\fP を作って作成された場合には、
を呼び出したプロセスで同じ値を返すのが「正しい」。 キャッシュが最新とならない問題 (stale\-cache problem) は、 \fIflags\fP
に \fBCLONE_VM\fP が含まれている場合にも発生しない。) 本当の値を得るためには、次のようなコードを使う必要があるかもしれない。
.nf
を呼び出したプロセスで同じ値を返すのが「正しい」。 キャッシュが最新とならない問題 (stale\-cache problem) は、 \fIflags\fP
に \fBCLONE_VM\fP が含まれている場合にも発生しない。) 本当の値を得るためには、次のようなコードを使う必要があるかもしれない。
.nf
.\" https://bugzilla.redhat.com/show_bug.cgi?id=417521
.\" http://sourceware.org/bugzilla/show_bug.cgi?id=6910
.SH 例
.\" https://bugzilla.redhat.com/show_bug.cgi?id=417521
.\" http://sourceware.org/bugzilla/show_bug.cgi?id=6910
.SH 例
以下のプログラムは、 別の UTS 名前空間で動作する子プロセスを \fBclone\fP() を使って作成する例である。 子プロセスは、自分の UTS
名前空間においてホスト名を変更する。 それから、親プロセスと子プロセスの両方でシステムのホスト名を表示し、 親プロセスと子プロセスの UTS
名前空間でホスト名が異なることを確認する。 このプログラムの使用方法については \fBsetns\fP(2) を参照。
以下のプログラムは、 別の UTS 名前空間で動作する子プロセスを \fBclone\fP() を使って作成する例である。 子プロセスは、自分の UTS
名前空間においてホスト名を変更する。 それから、親プロセスと子プロセスの両方でシステムのホスト名を表示し、 親プロセスと子プロセスの UTS
名前空間でホスト名が異なることを確認する。 このプログラムの使用方法については \fBsetns\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 この文書について
\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 この文書について