.\" Updated 2009-03-02, Akihiro MOTOKI, LDP v3.19
.\" Updated 2010-04-11, Akihiro MOTOKI, LDP v3.24
.\"
-.\"WORD: capability ¥±¡¼¥Ñ¥Ó¥ê¥Æ¥£
-.\"WORD: pending signals ½èÍýÂÔ¤Á¥·¥°¥Ê¥ë
-.\"WORD: namespace ̾Á°¶õ´Ö
+.\"WORD: capability ã\82±ã\83¼ã\83\91ã\83\93ã\83ªã\83\86ã\82£
+.\"WORD: pending signals 処理待ちシグナル
+.\"WORD: namespace 名前空間
.\"
.TH CLONE 2 2010-11-01 "Linux" "Linux Programmer's Manual"
-.SH ̾Á°
-clone, __clone2 \- »Ò¥×¥í¥»¥¹¤òºîÀ®¤¹¤ë
-.SH ½ñ¼°
+.SH 名前
+clone, __clone2 \- 子プロセスを作成する
+.SH 書式
.nf
-.BR "#define _GNU_SOURCE" " /* feature_test_macros(7) »²¾È */"
+.BR "#define _GNU_SOURCE" " /* feature_test_macros(7) 参照 */"
.\" Actually _BSD_SOURCE || _SVID_SOURCE
.\" See http://sources.redhat.com/bugzilla/show_bug.cgi?id=4749
.B #include <sched.h>
.BI " /* pid_t *" ptid ", struct user_desc *" tls \
", pid_t *" ctid " */ );"
.fi
-.SH ÀâÌÀ
+.SH 説明
.BR clone ()
-¤Ï
+は
.BR fork (2)
-¤ÈƱ¤¸¤è¤¦¤ÊÊýË¡¤Ç¿·¤·¤¤¥×¥í¥»¥¹¤òºîÀ®¤¹¤ë¡£
+と同じような方法で新しいプロセスを作成する。
.BR clone ()
-¤Ë¤Ï¡¢¥é¥¤¥Ö¥é¥ê´Ø¿ô¤È¤½¤Î²¼Áؤˤ¢¤¿¤ë
+には、ライブラリ関数とその下層にあたる
.BR clone ()
-¥·¥¹¥Æ¥à¥³¡¼¥ë¤¬Â¸ºß¤¹¤ë¡£°Ê²¼¤ÎÀâÌÀ¤Ç¤Ï¡¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÎÊý¤ò
+システムコールが存在する。以下の説明では、システムコールの方を
.B sys_clone
-¤Èɽ¤¹¤³¤È¤È¤¹¤ë¡£
+と表すこととする。
.B sys_clone
-¤Ë´Ø¤¹¤ëÀâÌÀ¤Ï¤³¤Î¥Þ¥Ë¥å¥¢¥ë¤ÎºÇ¸å¤ÎÊý¤Ë¤¢¤ë¡£
+に関する説明はこのマニュアルの最後の方にある。
.BR fork (2)
-¤È¤Ï°Û¤Ê¤ê¡¢¤³¤ì¤é¤Î¥³¡¼¥ë¤Ç¤Ï¡¢»Ò¥×¥í¥»¥¹ (child process)
-¤È¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È¤¬¡¢¥á¥â¥ê¶õ´Ö¡¢
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¥Æ¡¼¥Ö¥ë¡¢¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤Î¥Æ¡¼¥Ö¥ë¤Ê¤É¤Î
-¼Â¹Ô¥³¥ó¥Æ¥¥¹¥È¤Î°ìÉô¤ò¶¦Í¤Ç¤¤ë¡£
-(¤³¤Î¥Þ¥Ë¥å¥¢¥ë¤Ë¤ª¤±¤ë¡Ö¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¡×¤Ï¡¢Ä̾ï¤Ï
-¡Ö¿Æ¥×¥í¥»¥¹¡×¤È°ìÃפ¹¤ë¡£Ã¢¤·¡¢¸å½Ò¤Î
+ã\81¨ã\81¯ç\95°ã\81ªã\82\8aã\80\81ã\81\93ã\82\8cã\82\89ã\81®ã\82³ã\83¼ã\83«ã\81§ã\81¯ã\80\81å\90ã\83\97ã\83ã\82»ã\82¹ (child process)
+と呼び出し元のプロセスとが、メモリ空間、
+ファイルディスクリプタのテーブル、シグナル・ハンドラのテーブルなどの
+実行コンテキストの一部を共有できる。
+(このマニュアルにおける「呼び出し元のプロセス」は、通常は
+「親プロセス」と一致する。但し、後述の
.B CLONE_PARENT
-¤Î¹à¤â»²¾È¤Î¤³¤È)
+の項も参照のこと)
.BR clone ()
-¤Î¼çÍפʻÈÍÑË¡¤Ï¥¹¥ì¥Ã¥É (threads) ¤ò¼ÂÁõ¤¹¤ë¤³¤È¤Ç¤¢¤ë:
-°ì¤Ä¤Î¥×¥í¥°¥é¥à¤ÎÃæ¤ÎÊ£¿ô¤Î¥¹¥ì¥Ã¥É¤Ï¶¦Í¤µ¤ì¤¿¥á¥â¥ê¶õ´Ö¤Ç
-Ʊ»þ¤Ë¼Â¹Ô¤µ¤ì¤ë¡£
+の主要な使用法はスレッド (threads) を実装することである:
+一つのプログラムの中の複数のスレッドは共有されたメモリ空間で
+同時に実行される。
.BR clone ()
-¤Ç»Ò¥×¥í¥»¥¹¤¬ºîÀ®¤µ¤ì¤¿»þ¤Ë¡¢ºîÀ®¤µ¤ì¤¿»Ò¥×¥í¥»¥¹¤Ï´Ø¿ô
+で子プロセスが作成された時に、作成された子プロセスは関数
.IR fn ( arg )
-¤ò¼Â¹Ô¤¹¤ë¡£
-(¤³¤ÎÅÀ¤¬
+を実行する。
+(この点が
.BR fork (2)
-¤È¤Ï°Û¤Ê¤ë¡£
+とは異なる。
.BR fork (2)
-¤Î¾ì¹ç¡¢»Ò¥×¥í¥»¥¹¤Ï
+の場合、子プロセスは
.BR fork (2)
-¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¾ì½ê¤«¤é¼Â¹Ô¤ò³¤±¤ë¡£)
+が呼び出された場所から実行を続ける。)
.I fn
-°ú¤¿ô¤Ï¡¢»Ò¥×¥í¥»¥¹¤¬¼Â¹Ô¤ò»Ï¤á¤ë»þ¤Ë»Ò¥×¥í¥»¥¹¤¬¸Æ¤Ó½Ð¤¹
-´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
+引き数は、子プロセスが実行を始める時に子プロセスが呼び出す
+関数へのポインタである。
.I arg
-°ú¤¿ô¤Ï¤½¤Î¤Þ¤Þ
+引き数はそのまま
.I fn
-´Ø¿ô¤Ø¤ÈÅϤµ¤ì¤ë¡£
+関数へと渡される。
.IR fn ( arg )
-´Ø¿ô¤¬½ªÎ»¤¹¤ë¤È¡¢»Ò¥×¥í¥»¥¹¤Ï½ªÎ»¤¹¤ë¡£
+関数が終了すると、子プロセスは終了する。
.I fn
-¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤¿À°¿ô¤¬»Ò¥×¥í¥»¥¹¤Î½ªÎ»¥³¡¼¥É¤È¤Ê¤ë¡£
-»Ò¥×¥í¥»¥¹¤Ï¡¢
+によって返された整数が子プロセスの終了コードとなる。
+子プロセスは、
.BR exit (2)
-¤ò¸Æ¤ó¤ÇÌÀ¼¨Åª¤Ë½ªÎ»¤¹¤ë¤³¤È¤â¤¢¤ë¤·¡¢Ã×̿Ū¤Ê¥·¥°¥Ê¥ë¤ò¼õ¿®¤·¤¿
-¾ì¹ç¤Ë½ªÎ»¤¹¤ë¤³¤È¤â¤¢¤ë¡£
+を呼んで明示的に終了することもあるし、致命的なシグナルを受信した
+場合に終了することもある。
.I child_stack
-°ú¤¿ô¤Ï¡¢»Ò¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ë¥¹¥¿¥Ã¥¯¤Î°ÌÃÖ¤ò»ØÄꤹ¤ë¡£
-»Ò¥×¥í¥»¥¹¤È¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Ï¥á¥â¥ê¤ò¶¦Í¤¹¤ë¤³¤È¤¬¤¢¤ë¤¿¤á¡¢
-»Ò¥×¥í¥»¥¹¤Ï¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤ÈƱ¤¸¥¹¥¿¥Ã¥¯¤Ç¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¡£
-¤³¤Î¤¿¤á¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Ï»Ò¥×¥í¥»¥¹¤Î¥¹¥¿¥Ã¥¯¤Î¤¿¤á¤Î¥á¥â¥ê¶õ´Ö¤ò
-ÍÑ°Õ¤·¤Æ¡¢¤³¤Î¶õ´Ö¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò
+引き数は、子プロセスによって使用されるスタックの位置を指定する。
+子プロセスと呼び出し元のプロセスはメモリを共有することがあるため、
+子プロセスは呼び出し元のプロセスと同じスタックで実行することができない。
+このため、呼び出し元のプロセスは子プロセスのスタックのためのメモリ空間を
+用意して、この空間へのポインタを
.BR clone ()
-¤ØÅϤµ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
-(HP PA ¥×¥í¥»¥Ã¥µ°Ê³°¤Î) Linux ¤¬Æ°ºî¤¹¤ëÁ´¤Æ¤Î¥×¥í¥»¥Ã¥µ¤Ç¤Ï¡¢
-¥¹¥¿¥Ã¥¯¤Ï²¼Êý (¥¢¥É¥ì¥¹¤¬¾®¤µ¤¤Êý¸þ) ¤Ø¤È¿¤Ó¤ë¡£¤³¤Î¤¿¤á¡¢ÉáÄ̤Ï
+へ渡さなければならない。
+(HP PA プロセッサ以外の) Linux が動作する全てのプロセッサでは、
+スタックは下方 (アドレスが小さい方向) へと伸びる。このため、普通は
.I child_stack
-¤Ï»Ò¥×¥í¥»¥¹¤Î¥¹¥¿¥Ã¥¯¤Î¤¿¤á¤ËÍÑ°Õ¤·¤¿¥á¥â¥ê¶õ´Ö¤Î°ìÈÖÂ礤¤
-¥¢¥É¥ì¥¹¤ò»Ø¤¹¤è¤¦¤Ë¤¹¤ë¡£
+は子プロセスのスタックのために用意したメモリ空間の一番大きい
+アドレスを指すようにする。
.I flags
-¤Î²¼°Ì 1 ¥Ð¥¤¥È¤Ï»Ò¥×¥í¥»¥¹¤¬»à¤ó¤À¾ì¹ç¤Ë¿Æ¥×¥í¥»¥¹¤Ø¤ÈÁ÷¤é¤ì¤ë
-.I "½ªÎ»¥·¥°¥Ê¥ë (termination signal)"
-¤ÎÈÖ¹æ¤ò»ØÄꤹ¤ë¡£¤³¤Î¥·¥°¥Ê¥ë¤È¤·¤Æ
+の下位 1 バイトは子プロセスが死んだ場合に親プロセスへと送られる
+.I "終了シグナル (termination signal)"
+の番号を指定する。このシグナルとして
.B SIGCHLD
-°Ê³°¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¿Æ¥×¥í¥»¥¹¤Ï¡¢
+以外が指定された場合、親プロセスは、
.BR wait (2)
-¤Ç»Ò¥×¥í¥»¥¹¤òÂԤĺݤˡ¢¥ª¥×¥·¥ç¥ó¤È¤·¤Æ
+で子プロセスを待つ際に、オプションとして
.B __WALL
-¤Þ¤¿¤Ï
+または
.B __WCLONE
-¤ò»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
-¤É¤Î¥·¥°¥Ê¥ë¤â»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢»Ò¥×¥í¥»¥¹¤¬½ªÎ»¤·¤¿»þ¤Ë¿Æ¥×¥í¥»¥¹
-¤Ë¥·¥°¥Ê¥ë¤ÏÁ÷¤é¤ì¤Ê¤¤¡£
+を指定しなければならない。
+ã\81©ã\81®ã\82·ã\82°ã\83\8aã\83«ã\82\82æ\8c\87å®\9aã\81\95ã\82\8cã\81ªã\81\8bã\81£ã\81\9få ´å\90\88ã\80\81å\90ã\83\97ã\83ã\82»ã\82¹ã\81\8cçµ\82äº\86ã\81\97ã\81\9fæ\99\82ã\81«è¦ªã\83\97ã\83ã\82»ã\82¹
+にシグナルは送られない。
.I flags
-¤Ë¤Ï¡¢°Ê²¼¤ÎÄê¿ô¤Î¤¦¤Á 0¸Ä°Ê¾å¤ò¥Ó¥Ã¥ÈËè¤ÎÏÀÍýÏ (bitwise-or)
-¤ò¤È¤Ã¤¿¤â¤Î¤ò»ØÄê¤Ç¤¤ë¡£¤³¤ì¤é¤ÎÄê¿ô¤Ï¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È
-»Ò¥×¥í¥»¥¹¤Î´Ö¤Ç²¿¤ò¶¦Í¤¹¤ë¤«¤ò»ØÄꤹ¤ë:
+には、以下の定数のうち 0個以上をビット毎の論理和 (bitwise-or)
+をとったものを指定できる。これらの定数は呼び出し元のプロセスと
+子プロセスの間で何を共有するかを指定する:
.TP
-.BR CLONE_CHILD_CLEARTID " (Linux 2.5.49 °Ê¹ß)"
-»Ò¥×¥í¥»¥¹¤¬½ªÎ»¤·¤¿¤È¤¤Ë»Ò¥×¥í¥»¥¹¤Î¥á¥â¥êÆâ¤Î
+.BR CLONE_CHILD_CLEARTID " (Linux 2.5.49 以降)"
+子プロセスが終了したときに子プロセスのメモリ内の
.I ctid
-¤¬»Ø¤¹¾ì½ê¤Ë¤¢¤ë»Ò¥×¥í¥»¥¹¤Î¥¹¥ì¥Ã¥É ID ¤ò¾Ãµî¤·¡¢
-¤½¤Î¥¢¥É¥ì¥¹¤Ç futex ¤ò wake (µ¯¾²) ¤µ¤»¤ë¡£
-¤³¤Î¥¢¥É¥ì¥¹¤Ï
+が指す場所にある子プロセスのスレッド ID を消去し、
+そのアドレスで futex を wake (起床) させる。
+このアドレスは
.BR set_tid_address (2)
-¥·¥¹¥Æ¥à¥³¡¼¥ë¤ÇÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
-¤³¤Îµ¡Ç½¤Ï¥¹¥ì¥Ã¥É¥é¥¤¥Ö¥é¥ê¤Ç»ÈÍѤµ¤ì¤ë¡£
+システムコールで変更することができる。
+この機能はスレッドライブラリで使用される。
.TP
-.BR CLONE_CHILD_SETTID " (Linux 2.5.49 °Ê¹ß)"
-»Ò¥×¥í¥»¥¹¤Î¥á¥â¥êÆâ¤Î
+.BR CLONE_CHILD_SETTID " (Linux 2.5.49 以降)"
+子プロセスのメモリ内の
.I ctid
-¤¬»Ø¤¹¾ì½ê¤Ë»Ò¥×¥í¥»¥¹¤Î¥¹¥ì¥Ã¥É ID ¤ò³ÊǼ¤¹¤ë¡£
+が指す場所に子プロセスのスレッド ID を格納する。
.TP
.B CLONE_FILES
.B CLONE_FILES
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹¤Ï¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î
-¥Æ¡¼¥Ö¥ë¤ò¶¦Í¤¹¤ë¡£
-¸Æ¤Ó½Ð¤·¸µ¥×¥í¥»¥¹¤È¤½¤Î»Ò¥×¥í¥»¥¹¤Î°ìÊý¤¬ºîÀ®¤·¤¿
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ï¡¢¤â¤¦°ìÊý¤Ë¤ª¤¤¤Æ¤â͸ú¤Ç¤¢¤ë¡£
-Ʊ¤¸¤è¤¦¤Ë¡¢°ìÊý¤Î¥×¥í¥»¥¹¤¬¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤òÊĤ¸¤¿¤ê¡¢
+が設定された場合、呼び出し元のプロセスと子プロセスはファイルディスクリプタの
+テーブルを共有する。
+呼び出し元プロセスとその子プロセスの一方が作成した
+ファイルディスクリプタは、もう一方においても有効である。
+同じように、一方のプロセスがファイルディスクリプタを閉じたり、
.RB ( fcntl (2)
.B F_SETFD
-Áàºî¤ò»È¤Ã¤Æ) ¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ë´ØÏ¢¤¹¤ë¥Õ¥é¥°¤òÊѹ¹¤·¤¿¤ê¤¹¤ë¤È¡¢
-¤â¤¦°ìÊý¤Î¥×¥í¥»¥¹¤Ë¤â±Æ¶Á¤¹¤ë¡£
+操作を使って) ディスクリプタに関連するフラグを変更したりすると、
+もう一方のプロセスにも影響する。
.B CLONE_FILES
-¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢»Ò¥×¥í¥»¥¹¤Ï¡¢
+が設定されていない場合、子プロセスは、
.BR clone ()
-¤¬¼Â¹Ô¤µ¤ì¤¿»þÅÀ¤Ç¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤¬¥ª¡¼¥×¥ó¤·¤Æ¤¤¤ëÁ´¤Æ¤Î
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¥³¥Ô¡¼¤ò·Ñ¾µ¤¹¤ë
-(»Ò¥×¥í¥»¥¹¤ÎÊ£À½¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ï¡¢
-Âбþ¤¹¤ë¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤È
-Ʊ¤¸¥Õ¥¡¥¤¥ëµ½Ò
+が実行された時点で、呼び出し元のプロセスがオープンしている全ての
+ファイルディスクリプタのコピーを継承する
+(子プロセスの複製されたファイルディスクリプタは、
+対応する呼び出し元のプロセスのファイルディスクリプタと
+同じファイル記述
.RB ( open (2)
-»²¾È) ¤ò»²¾È¤¹¤ë)¡£
-¤³¤ì°Ê¹ß¤Ë¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹¤Î°ìÊý¤¬
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ÎÁàºî (¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î
-¥ª¡¼¥×¥ó¡¦¥¯¥í¡¼¥º¤ä¡¢¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¡¦¥Õ¥é¥°¤ÎÊѹ¹)
-¤ò¹Ô¤Ã¤Æ¤â¡¢¤â¤¦°ìÊý¤Î¥×¥í¥»¥¹¤Ë¤Ï±Æ¶Á¤òÍ¿¤¨¤Ê¤¤¡£
+参照) を参照する)。
+これ以降に、呼び出し元のプロセスと子プロセスの一方が
+ファイルディスクリプタの操作 (ファイルディスクリプタの
+オープン・クローズや、ファイルディスクリプタ・フラグの変更)
+を行っても、もう一方のプロセスには影響を与えない。
.TP
.B CLONE_FS
.B CLONE_FS
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹¤¬Æ±¤¸¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à
-¾ðÊó¤ò¶¦Í¤¹¤ë¡£¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¾ðÊó¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤Î¥ë¡¼¥È (root)¡¢
-¥«¥ì¥ó¥È¡¦¥ï¡¼¥¥ó¥°¡¦¥Ç¥£¥ì¥¯¥È¥ê (current working directory)
-¤ä umask ¤Ê¤É¤Ç¤¢¤ë¡£
-¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤ä»Ò¥×¥í¥»¥¹¤Î¤É¤Á¤é¤«°ìÊý¤Ë¤è¤Ã¤Æ
+が設定された場合、呼び出し元のプロセスと子プロセスが同じファイル・システム
+情報を共有する。ファイル・システム情報は、ファイル・システムのルート (root)、
+カレント・ワーキング・ディレクトリ (current working directory)
+や umask などである。
+呼び出し元のプロセスや子プロセスのどちらか一方によって
.BR chroot (2),
.BR chdir (2),
.BR umask (2)
-¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¢¤â¤¦°ìÊý¤Î¥×¥í¥»¥¹¤Ë¤â±Æ¶Á¤¬µÚ¤Ö¡£
+が呼び出されると、もう一方のプロセスにも影響が及ぶ。
.B CLONE_FS
-¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢»Ò¥×¥í¥»¥¹¤Ï¡¢
+が設定されていない場合、子プロセスは、
.BR clone ()
-¤¬¼Â¹Ô¤µ¤ì¤¿»þÅÀ¤Ç¤Î¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Î¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¾ðÊó¤Î¥³¥Ô¡¼¤ò
-»ÈÍѤ¹¤ë¡£
-¤³¤ì°Ê¹ß¤Ï¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹¤Î°ìÊý¤¬
+が実行された時点での、呼び出し元のプロセスのファイル・システム情報のコピーを
+使用する。
+これ以降は、呼び出し元のプロセスと子プロセスの一方が
.BR chroot (2),
.BR chdir (2),
.BR umask (2)
-¤ò¸Æ¤Ó½Ð¤·¤Æ¤â¡¢¤â¤¦°ìÊý¤Î¥×¥í¥»¥¹¤Ë¤Ï±Æ¶Á¤òÍ¿¤¨¤Ê¤¤¡£
+を呼び出しても、もう一方のプロセスには影響を与えない。
.TP
-.BR CLONE_IO " (Linux 2.6.25 °Ê¹ß)"
+.BR CLONE_IO " (Linux 2.6.25 以降)"
.B CLONE_IO
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¿·¤·¤¤¥×¥í¥»¥¹¤Ï¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È
-I/O ¥³¥ó¥Æ¥¥¹¥È¤ò¶¦Í¤¹¤ë¡£
-¤³¤Î¥Õ¥é¥°¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢
+が設定された場合、新しいプロセスは呼び出し元のプロセスと
+I/O コンテキストを共有する。
+このフラグが設定されていない場合には、
.RB ( fork (2)
-¤Î¾ì¹ç¤ÈƱÍÍ) ¿·¤·¤¤¥×¥í¥»¥¹¤Ï¼«Ê¬ÀìÍѤΠI/O ¥³¥ó¥Æ¥¥¹¥È¤ò»ý¤Ä¡£
+の場合と同様) 新しいプロセスは自分専用の I/O コンテキストを持つ。
.\" The following based on text from Jens Axboe
-I/O ¥³¥ó¥Æ¥¥¹¥È¤Ï¡¢¥Ç¥£¥¹¥¯¥¹¥±¥¸¥å¡¼¥ë¤Î I/O ¥¹¥³¡¼¥×¤Ç¤¢¤ë
-(¸À¤¤´¹¤¨¤ë¤È¡¢I/O ¥³¥ó¥Æ¥¥¹¥È¤Ï I/O ¥¹¥±¥¸¥å¡¼¥é¤¬¥×¥í¥»¥¹ I/O ¤Î
-¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ò¥â¥Ç¥ë²½¤¹¤ë¤Î¤Ë»ÈÍѤµ¤ì¤ë)¡£
-Ê£¿ô¤Î¥×¥í¥»¥¹¤¬Æ±¤¸ I/O ¥³¥ó¥Æ¥¥¹¥È¤ò¶¦Í¤¹¤ë¾ì¹ç¡¢
-¤³¤ì¤é¤Î¥×¥í¥»¥¹¤Ï I/O ¥¹¥±¥¸¥å¡¼¥é¤«¤é¤Ï°ì¤Ä¤È¤·¤Æ°·¤ï¤ì¤ë¡£
-·ë²Ì¤È¤·¤Æ¡¢¤³¤ì¤é¤Î¥×¥í¥»¥¹¤Ï¥Ç¥£¥¹¥¯¥¢¥¯¥»¥¹¤Î»þ´Ö¤ò¶¦Í¤¹¤ë¤è¤¦¤Ë¤Ê¤ë¡£
-¤¤¤¯¤Ä¤«¤Î I/O ¥¹¥±¥¸¥å¡¼¥é¤Ç¤Ï¡¢
-.\" ͽ¬¥¹¥±¥¸¥å¡¼¥é¤È CFQ ¥¹¥±¥¸¥å¡¼¥é
-Æó¤Ä¤Î¥×¥í¥»¥¹¤¬ I/O ¥³¥ó¥Æ¥¥¹¥È¤ò¶¦Í¤·¤Æ¤¤¤ë¾ì¹ç¡¢
-¤³¤ì¤é¤Î¥×¥í¥»¥¹¤Ï¥Ç¥£¥¹¥¯¥¢¥¯¥»¥¹¤ò¸ò¸ß¤Ë¹Ô¤¦¤³¤È¤¬¤Ç¤¤ë¡£
-Ʊ¤¸¥×¥í¥»¥¹¤ÎÊ£¿ô¤Î¥¹¥ì¥Ã¥É¤¬ I/O ¤ò¼Â¹Ô¤·¤Æ¤¤¤ë¾ì¹ç
-(Î㤨¤Ð
-.BR aio_read (3))¡¢
+I/O コンテキストは、ディスクスケジュールの I/O スコープである
+(言い換えると、I/O コンテキストは I/O スケジューラがプロセス I/O の
+スケジューリングをモデル化するのに使用される)。
+複数のプロセスが同じ I/O コンテキストを共有する場合、
+これらのプロセスは I/O スケジューラからは一つとして扱われる。
+結果として、これらのプロセスはディスクアクセスの時間を共有するようになる。
+いくつかの I/O スケジューラでは、
+.\" 予測スケジューラと CFQ スケジューラ
+二つのプロセスが I/O コンテキストを共有している場合、
+これらのプロセスはディスクアクセスを交互に行うことができる。
+同じプロセスの複数のスレッドが I/O を実行している場合
+(例えば
+.BR aio_read (3))、
.B CLONE_IO
-¤òÍøÍѤ¹¤ë¤³¤È¤Ç I/O Àǽ¤òÎɤ¯¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
-.\" CFQ ¤È AS ¤Î¾ì¹ç
+を利用することで I/O 性能を良くすることができる。
+.\" CFQ と AS の場合
-¥«¡¼¥Í¥ë¤ÎÀßÄ꤬
+カーネルの設定が
.B CONFIG_BLOCK
-¥ª¥×¥·¥ç¥óÉÕ¤¤Ç¤Ê¤¤¾ì¹ç¡¢
-¤³¤Î¥Õ¥é¥°¤Ï²¿¤Î°ÕÌ£¤â»ý¤¿¤Ê¤¤¡£
+オプション付きでない場合、
+このフラグは何の意味も持たない。
.TP
-.BR CLONE_NEWIPC " (Linux 2.6.19 °Ê¹ß)"
+.BR CLONE_NEWIPC " (Linux 2.6.19 以降)"
.B CLONE_NEWIPC
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¿·¤·¤¤ IPC ̾Á°¶õ´Ö (namespace) ¤Ç¥×¥í¥»¥¹¤òºîÀ®¤¹¤ë¡£
-¤³¤Î¥Õ¥é¥°¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢
+が設定された場合、新しい IPC 名前空間 (namespace) でプロセスを作成する。
+このフラグが設定されていない場合、
.RB ( fork (2)
-¤Î¾ì¹ç¤ÈƱÍÍ) ¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤ÈƱ¤¸ IPC ̾Á°¶õ´Ö¤Ç¥×¥í¥»¥¹¤¬
-ºîÀ®¤µ¤ì¤ë¡£
-¤³¤Î¥Õ¥é¥°¤Ï¡¢¥³¥ó¥Æ¥Ê¤Î¼ÂÁõ¤Ç¤Î»ÈÍѤò°Õ¿Þ¤·¤ÆÍÑ°Õ¤µ¤ì¤¿¤â¤Î¤Ç¤¢¤ë¡£
+の場合と同様) 呼び出し元のプロセスと同じ IPC 名前空間でプロセスが
+作成される。
+このフラグは、コンテナの実装での使用を意図して用意されたものである。
-IPC ̾Á°¶õ´Ö¤Ï¡¢System V IPC ¥ª¥Ö¥¸¥§¥¯¥ÈÍѤμ±ÊÌ»Ò (identifiers) ¤Î
-½¸¹ç¤Ç¹½À®¤µ¤ì¤ë
-(System V IPC ¥ª¥Ö¥¸¥§¥¯¥È¤Ï
+IPC 名前空間は、System V IPC オブジェクト用の識別子 (identifiers) の
+集合で構成される
+(System V IPC オブジェクトは
.BR msgctl (2),
.BR semctl (2),
.BR shmctl (2)
-¤ò»È¤Ã¤ÆºîÀ®¤µ¤ì¤ë)¡£
-¤¢¤ë IPC ̾Á°¶õ´Ö¤ËºîÀ®¤µ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢
-¤½¤Î̾Á°¶õ´Ö¤Î¥á¥ó¥Ð¡¼¤Ç¤¢¤ë¾¤Î¤¹¤Ù¤Æ¤Î¥×¥í¥»¥¹¤«¤é¤â¸«¤¨¤ë¤¬¡¢
-°ã¤¦ IPC ̾Á°¶õ´Ö¤Î¥×¥í¥»¥¹¤«¤é¤Ï¸«¤¨¤Ê¤¤¡£
+を使って作成される)。
+ある IPC 名前空間に作成されたオブジェクトは、
+その名前空間のメンバーである他のすべてのプロセスからも見えるが、
+違う IPC 名前空間のプロセスからは見えない。
-IPC ̾Á°¶õ´Ö¤¬ÇË´þ¤µ¤ì¤ë»þ
-(¤¹¤Ê¤ï¤Á¡¢¤½¤Î̾Á°¶õ´Ö¤Î¥á¥ó¥Ð¡¼¤ÎºÇ¸å¤Î¥×¥í¥»¥¹¤¬½ªÎ»¤¹¤ë»þ)¡¢
-¤½¤Î̾Á°¶õ´Ö¤ÎÁ´¤Æ¤Î IPC ¥ª¥Ö¥¸¥§¥¯¥È¤Ï¼«Æ°Åª¤ËÇË´þ¤µ¤ì¤ë¡£
+IPC 名前空間が破棄される時
+(すなわち、その名前空間のメンバーの最後のプロセスが終了する時)、
+その名前空間の全ての IPC オブジェクトは自動的に破棄される。
-¤³¤Î¥Õ¥é¥°¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢
-¥«¡¼¥Í¥ë¤Ç¥ª¥×¥·¥ç¥ó
+このフラグを使用するためには、
+カーネルでオプション
.B CONFIG_SYSVIPC
-¤È
+と
.B CONFIG_IPC_NS
-¤ò͸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¡¢
-¥×¥í¥»¥¹¤¬Æø¢
+を有効になっていること、
+プロセスが特権
.RB ( CAP_SYS_ADMIN )
-¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬É¬ÍפǤ¢¤ë¡£
-¤³¤Î¥Õ¥é¥°¤Ï
+を持っていることが必要である。
+このフラグは
.B CLONE_SYSVSEM
-¤ÈÁȤ߹ç¤ï¤»¤Æ»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¤¡£
+と組み合わせて使うことはできない。
.TP
-.BR CLONE_NEWNET " (Linux 2.6.24 °Ê¹ß)"
-(¤³¤Î¥Õ¥é¥°¤Î¼ÂÁõ¤Ï¡¢Linux 2.6.29 ¤¢¤¿¤ê¤Þ¤Ç¤Ë´°À®¤·¤¿¡£)
+.BR CLONE_NEWNET " (Linux 2.6.24 以降)"
+(このフラグの実装は、Linux 2.6.29 あたりまでに完成した。)
.B CLONE_NEWNET
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¿·¤·¤¤¥Í¥Ã¥È¥ï¡¼¥¯Ì¾Á°¶õ´Ö (network namaspace)
-¤Ç¥×¥í¥»¥¹¤òºîÀ®¤¹¤ë¡£
-¤³¤Î¥Õ¥é¥°¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢
+が設定された場合、新しいネットワーク名前空間 (network namaspace)
+でプロセスを作成する。
+このフラグが設定されていない場合、
.RB ( fork (2)
-¤Î¾ì¹ç¤ÈƱÍÍ) ¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤ÈƱ¤¸¥Í¥Ã¥È¥ï¡¼¥¯Ì¾Á°¶õ´Ö¤Ç¥×¥í¥»¥¹¤¬
-ºîÀ®¤µ¤ì¤ë¡£
-¤³¤Î¥Õ¥é¥°¤Ï¡¢¥³¥ó¥Æ¥Ê¤Î¼ÂÁõ¤Ç¤Î»ÈÍѤò°Õ¿Þ¤·¤ÆÍÑ°Õ¤µ¤ì¤¿¤â¤Î¤Ç¤¢¤ë¡£
-
-¥Í¥Ã¥È¥ï¡¼¥¯Ì¾Á°¶õ´Ö¤Ï¡¢Ê¬Î¥¤µ¤ì¤¿¥Í¥Ã¥È¥ï¡¼¥¯¥¹¥¿¥Ã¥¯¤òÄ󶡤¹¤ë¤â¤Î¤Ç¤¢¤ë
-(¥Í¥Ã¥È¥ï¡¼¥¯¥¹¥¿¥Ã¥¯¤È¤Ï¡¢
-¥Í¥Ã¥È¥ï¡¼¥¯¥Ç¥Ð¥¤¥¹¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢IPv4 ¤ä IPv6 ¥×¥í¥È¥³¥ë¥¹¥¿¥Ã¥¯¡¢
-.IR /proc/net ¡¢
+の場合と同様) 呼び出し元のプロセスと同じネットワーク名前空間でプロセスが
+作成される。
+このフラグは、コンテナの実装での使用を意図して用意されたものである。
+
+ネットワーク名前空間は、分離されたネットワークスタックを提供するものである
+(ネットワークスタックとは、
+ネットワークデバイスインタフェース、IPv4 や IPv6 プロトコルスタック、
+.IR /proc/net 、
.I /sys/class/net
-¥Ç¥£¥ì¥¯¥È¥ê¥Ä¥ê¡¼¡¢¥½¥±¥Ã¥È¤Ê¤É¤Ç¤¢¤ë)¡£
-ʪÍý¥Í¥Ã¥È¥ï¡¼¥¯¥Ç¥Ð¥¤¥¹¤¬½ê°¤Ç¤¤ë¥Í¥Ã¥È¥ï¡¼¥¯Ì¾Á°¶õ´Ö¤Ï°ì¤Ä¤À¤±¤Ç¤¢¤ë¡£
-²¾Áۥͥåȥ¥¯¥Ç¥Ð¥¤¥¹ ("veth") ¤Î¥Ú¥¢¤Ë¤è¤ê
-¥Ñ¥¤¥×É÷¤ÎÃê¾Ý²½ (abstraction) ¤¬¼Â¸½¤µ¤ì¤Æ¤ª¤ê¡¢
-¤³¤ì¤ò»È¤¦¤³¤È¤Ç¡¢¥Í¥Ã¥È¥ï¡¼¥¯Ì¾Á°¶õ´Ö´Ö¤Î¥È¥ó¥Í¥ë¤òºîÀ®¤·¤¿¤ê¡¢
-Ê̤Î̾Á°¶õ´Ö¤ÎʪÍý¥Í¥Ã¥È¥ï¡¼¥¯¥Ç¥Ð¥¤¥¹¤Ø¤Î¥Ö¥ê¥Ã¥¸¤òºîÀ®¤·¤¿¤ê
-¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
-
-¥Í¥Ã¥È¥ï¡¼¥¯Ì¾Á°¶õ´Ö¤¬²òÊü¤µ¤ì¤ë»þ
-(¤¹¤Ê¤ï¤Á¡¢¤½¤Î̾Á°¶õ´Ö¤ÎºÇ¸å¤Î¥×¥í¥»¥¹¤¬½ªÎ»¤¹¤ë»þ)¡¢
-ʪÍý¥Í¥Ã¥È¥ï¡¼¥¯¥Ç¥Ð¥¤¥¹¤Ï½é´ü¥Í¥Ã¥È¥ï¡¼¥¯Ì¾Á°¶õ´Ö
-(initial network namespace) ¤ËÌᤵ¤ì¤ë
-(¿Æ¥×¥í¥»¥¹¤Î¥Í¥Ã¥È¥ï¡¼¥¯Ì¾Á°¶õ´Ö¤ËÌᤵ¤ì¤ëÌõ¤Ç¤Ï¤Ê¤¤)¡£
-
-¤³¤Î¥Õ¥é¥°¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢
-¥«¡¼¥Í¥ë¤Ç¥ª¥×¥·¥ç¥ó
+ディレクトリツリー、ソケットなどである)。
+物理ネットワークデバイスが所属できるネットワーク名前空間は一つだけである。
+仮想ネットワークデバイス ("veth") のペアにより
+パイプ風の抽象化 (abstraction) が実現されており、
+これを使うことで、ネットワーク名前空間間のトンネルを作成したり、
+別の名前空間の物理ネットワークデバイスへのブリッジを作成したり
+することができる。
+
+ネットワーク名前空間が解放される時
+(すなわち、その名前空間の最後のプロセスが終了する時)、
+物理ネットワークデバイスは初期ネットワーク名前空間
+(initial network namespace) に戻される
+(親プロセスのネットワーク名前空間に戻される訳ではない)。
+
+このフラグを使用するためには、
+カーネルでオプション
.B CONFIG_NET_NS
-¤ò͸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¡¢
-¥×¥í¥»¥¹¤¬Æø¢
+を有効になっていること、
+プロセスが特権
.RB ( CAP_SYS_ADMIN )
-¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬É¬ÍפǤ¢¤ë¡£
+を持っていることが必要である。
.TP
-.BR CLONE_NEWNS " (Linux 2.4.19 °Ê¹ß)"
-»Ò¥×¥í¥»¥¹¤ò¿·¤·¤¤¥Þ¥¦¥ó¥È̾Á°¶õ´Ö (mount namespace) ¤Ç³«»Ï¤¹¤ë¡£
+.BR CLONE_NEWNS " (Linux 2.4.19 以降)"
+子プロセスを新しいマウント名前空間 (mount namespace) で開始する。
-³Æ¥×¥í¥»¥¹¤Ï¤¢¤ë°ì¤Ä¤Î¥Þ¥¦¥ó¥È̾Á°¶õ´ÖÃæ¤Ë¸ºß¤¹¤ë¡£¥×¥í¥»¥¹¤Î
-.I "̾Á°¶õ´Ö (namespace)"
-¤Ï¡¢¤½¤Î¥×¥í¥»¥¹¤«¤é¸«¤¨¤ë¥Õ¥¡¥¤¥ë³¬Áؤòɽ¤¹¥Ç¡¼¥¿ (mount ¤Î½¸¹ç) ¤Ç¤¢¤ë¡£
+各プロセスはある一つのマウント名前空間中に存在する。プロセスの
+.I "名前空間 (namespace)"
+は、そのプロセスから見えるファイル階層を表すデータ (mount の集合) である。
.B CLONE_NEWNS
-¥Õ¥é¥°¤¬¥»¥Ã¥È¤µ¤ì¤º¤Ë
+フラグがセットされずに
.BR fork (2)
-¤«
+か
.BR clone ()
-¤¬¸Æ¤Ð¤ì¤ë¤È¡¢»Ò¥×¥í¥»¥¹¤Ï¿Æ¥×¥í¥»¥¹¤ÈƱ¤¸¥Þ¥¦¥ó¥È̾Á°¶õ´Ö¤ËºîÀ®¤µ¤ì¤ë¡£
-¥·¥¹¥Æ¥à¥³¡¼¥ë
-.BR mount (2)¡¢
+が呼ばれると、子プロセスは親プロセスと同じマウント名前空間に作成される。
+システムコール
+.BR mount (2)、
.BR umount (2)
-¤¬¸Æ¤Ð¤ì¤ë¤È¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Î¥Þ¥¦¥ó¥È̾Á°¶õ´Ö¤¬Êѹ¹¤µ¤ì¡¢¤³¤Î·ë²Ì
-¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤ÈƱ¤¸Ì¾Á°¶õ´Ö¤Ë¤¤¤ë¥×¥í¥»¥¹¤Ï¤¹¤Ù¤Æ±Æ¶Á¤ò¼õ¤±¤ë¤¬¡¢
-°Û¤Ê¤ë¥Þ¥¦¥ó¥È̾Á°¶õ´Ö¤Ë¤¤¤ë¥×¥í¥»¥¹¤Ï±Æ¶Á¤ò¼õ¤±¤Ê¤¤¡£
+が呼ばれると呼び出し元のプロセスのマウント名前空間が変更され、この結果
+呼び出し元のプロセスと同じ名前空間にいるプロセスはすべて影響を受けるが、
+異なるマウント名前空間にいるプロセスは影響を受けない。
.B CLONE_NEWNS
-¥Õ¥é¥°¤¬¥»¥Ã¥È¤µ¤ì¤Æ
+フラグがセットされて
.BR clone ()
-¤¬¸Æ¤Ð¤ì¤ë¤È¡¢clone ¤ÇºîÀ®¤µ¤ì¤¿»Ò¥×¥í¥»¥¹¤Ï¿·¤·¤¤¥Þ¥¦¥ó¥È̾Á°¶õ´Ö¤Ç
-³«»Ï¤µ¤ì¤ë¡£¿·¤·¤¤Ì¾Á°¶õ´Ö¤Ï¿Æ¥×¥í¥»¥¹¤Î̾Á°¶õ´Ö¤Î¥³¥Ô¡¼¤Ç½é´ü²½¤µ¤ì¤ë¡£
+が呼ばれると、clone で作成された子プロセスは新しいマウント名前空間で
+開始される。新しい名前空間は親プロセスの名前空間のコピーで初期化される。
-Æø¢¥×¥í¥»¥¹ (\fBCAP_SYS_ADMIN\fP ¥±¡¼¥Ñ¥Ó¥ê¥Æ¥£¤ò»ý¤Ä¥×¥í¥»¥¹) ¤Î¤ß¤¬
+特権プロセス (\fBCAP_SYS_ADMIN\fP ケーパビリティを持つプロセス) のみが
.B CLONE_NEWNS
-¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤¤ë¡£
-°ì¤Ä¤Î
+フラグを指定することができる。
+一つの
.BR clone ()
-¸Æ¤Ó½Ð¤·¤Ç¡¢
+呼び出しで、
.B CLONE_NEWNS
-¤È
+と
.B CLONE_FS
-¤ÎξÊý¤ò»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡£
+の両方を指定することはできない。
.TP
-.BR CLONE_NEWPID " (Linux 2.6.24 °Ê¹ß)"
+.BR CLONE_NEWPID " (Linux 2.6.24 以降)"
.\" This explanation draws a lot of details from
.\" http://lwn.net/Articles/259217/
.\" Authors: Pavel Emelyanov <xemul@openvz.org>
.\" The primary kernel commit is 30e49c263e36341b60b735cbef5ca37912549264
.\" Author: Pavel Emelyanov <xemul@openvz.org>
.B CLONE_NEWPID
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¿·¤·¤¤ PID ̾Á°¶õ´Ö¤Ç¥×¥í¥»¥¹¤òºîÀ®¤¹¤ë¡£
-¤³¤Î¥Õ¥é¥°¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢
+が設定された場合、新しい PID 名前空間でプロセスを作成する。
+このフラグが設定されていない場合、
.RB ( fork (2)
-¤Î¾ì¹ç¤ÈƱÍÍ) ¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤ÈƱ¤¸ PID ̾Á°¶õ´Ö¤Ç
-¥×¥í¥»¥¹¤¬ºîÀ®¤µ¤ì¤ë¡£
-¤³¤Î¥Õ¥é¥°¤Ï¡¢¥³¥ó¥Æ¥Ê¤Î¼ÂÁõ¤Ç¤Î»ÈÍѤò°Õ¿Þ¤·¤ÆÍÑ°Õ¤µ¤ì¤¿¤â¤Î¤Ç¤¢¤ë¡£
+の場合と同様) 呼び出し元のプロセスと同じ PID 名前空間で
+プロセスが作成される。
+このフラグは、コンテナの実装での使用を意図して用意されたものである。
-PID ̾Á°¶õ´Ö¤Ï¡¢PID ¤Ë´Ø¤·¤ÆʬΥ¤µ¤ì¤¿´Ä¶¤òÄ󶡤¹¤ë¤â¤Î¤Ç¤¢¤ë¡£
-¿·¤·¤¤Ì¾Á°¶õ´Ö¤Ë¤ª¤±¤ë PID ¤Ï 1 ¤«¤é»Ï¤Þ¤ê
-(¤³¤ì¤Ï¥¹¥¿¥ó¥É¥¢¥í¥ó¤Î¥·¥¹¥Æ¥à¤È»÷¤¿¤è¤¦¤Ê´¶¤¸)¡¢
+PID 名前空間は、PID に関して分離された環境を提供するものである。
+新しい名前空間における PID は 1 から始まり
+(これはスタンドアロンのシステムと似たような感じ)、
.BR fork (2),
.BR vfork (2),
.BR clone ()
-¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¤½¤Î̾Á°¶õ´Ö¤Ç°ì°Õ¤Ê PID ¤ò»ý¤Ã¤¿¥×¥í¥»¥¹¤¬ºîÀ®¤µ¤ì¤ë¡£
+を呼び出すと、その名前空間で一意な PID を持ったプロセスが作成される。
-¿·¤·¤¤Ì¾Á°¶õ´Ö¤ÇºîÀ®¤µ¤ì¤ëºÇ½é¤Î¥×¥í¥»¥¹
-(¤Ä¤Þ¤ê¡¢
+æ\96°ã\81\97ã\81\84å\90\8då\89\8d空é\96\93ã\81§ä½\9cæ\88\90ã\81\95ã\82\8cã\82\8bæ\9c\80å\88\9dã\81®ã\83\97ã\83ã\82»ã\82¹
+(つまり、
.B CLONE_NEWPID
-¥Õ¥é¥°¤ò»È¤Ã¤ÆºîÀ®¤µ¤ì¤¿¥×¥í¥»¥¹) ¤Î PID ¤Ï 1 ¤Ç¤¢¤ê¡¢
-¤³¤Î¥×¥í¥»¥¹¤Ï¤½¤Î̾Á°¶õ´Ö¤Ë¤ª¤±¤ë "init" ¥×¥í¥»¥¹¤È¤Ê¤ë¡£
-¤³¤Î̾Á°¶õ´Ö¤Ë¤ª¤¤¤Æ¸É»ù (orphaned) ¤È¤Ê¤Ã¤¿»Ò¥×¥í¥»¥¹¤Ë¤Ä¤¤¤Æ¤Ï¡¢
+フラグを使って作成されたプロセス) の PID は 1 であり、
+このプロセスはその名前空間における "init" プロセスとなる。
+この名前空間において孤児 (orphaned) となった子プロセスについては、
.BR init (8)
-¤Ç¤Ï¤Ê¤¯¤³¤Î¥×¥í¥»¥¹¤¬¿Æ¥×¥í¥»¥¹¤È¤Ê¤ë¡£
-ÀΤʤ¬¤é¤Î
+ではなくこのプロセスが親プロセスとなる。
+昔ながらの
.B init
-¥×¥í¥»¥¹¤È¤Ï°ã¤¤¡¢PID ̾Á°¶õ´Ö¤Î "init" ¥×¥í¥»¥¹¤Ï½ªÎ» (terminated) ¤¹¤ë
-¤³¤È¤¬¤Ç¤¡¢¤½¤Î¾ì¹ç¤Ë¤Ï¡¢¤³¤Î̾Á°¶õ´Ö¤ÎÁ´¤Æ¤Î¥×¥í¥»¥¹¤¬½ªÎ»¤µ¤ì¤ë¡£
-
-PID ̾Á°¶õ´Ö´Ö¤Ë¤Ï³¬Áع½Â¤¤¬·ÁÀ®¤µ¤ì¤ë¡£
-¿·¤·¤¤ PID ̾Á°¶õ´Ö¤¬ºîÀ®¤µ¤ì¤ë¤È¡¢¤½¤Î̾Á°¶õ´Ö¤Î¥×¥í¥»¥¹¤Ï¡¢
-¿·¤·¤¤Ì¾Á°¶õ´Ö¤òºîÀ®¤·¤¿¥×¥í¥»¥¹¤Î PID ̾Á°¶õ´Ö¤Ç¸«¤¨¤ë¡£
-ƱÍͤˡ¢¿Æ¤Î PID ̾Á°¶õ´Ö¼«ÂΤ¬Ê̤ΠPID ̾Á°¶õ´Ö¤Î»Ò¶¡¤Î¾ì¹ç¤Ë¤Ï¡¢
-»Ò¶¡¤Î PID ̾Á°¶õ´Ö¤È¿Æ¤Î PID ̾Á°¶õ´Ö¤Î¥×¥í¥»¥¹¤Ï¤É¤ì¤â
-¿Æ¤Î¿Æ¤Î PID ̾Á°¶õ´Ö¤Ç¤â¸«¤¨¤ë¤³¤È¤Ë¤Ê¤ë¡£
-È¿ÂФˡ¢¡Ö»Ò¶¡¡×¤Î PID ̾Á°¶õ´Ö¤Î¥×¥í¥»¥¹¤Ë¤Ï¡¢
-¿Æ¤Î̾Á°¶õ´Ö¤Î¥×¥í¥»¥¹¤Ï¸«¤¨¤Ê¤¤¡£
-̾Á°¶õ´Ö¤Ë³¬Áع½Â¤¤¬Â¸ºß¤¹¤ë¤È¤¤¤¦¤³¤È¤Ï¡¢¸Ä¡¹¤Î¥×¥í¥»¥¹¤Ï
-Ê£¿ô¤Î PID ¤ò»ý¤Ä¤È¤¤¤¦¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤ë¡£
-¤½¤Î¥×¥í¥»¥¹¤¬¸«¤¨¤ë̾Á°¶õ´Ö°ì¤Ä¤Ë¤Ä¤ PID ¤¬°ì¤Ä¤¢¤ê¡¢
-¤½¤ì¤¾¤ì¤Î PID ¤ÏÂбþ¤¹¤ë̾Á°¶õ´Ö¤Ë¤ª¤¤¤Æ°ì°Õ¤Ç¤¢¤ë¡£
+プロセスとは違い、PID 名前空間の "init" プロセスは終了 (terminated) する
+ことができ、その場合には、この名前空間の全てのプロセスが終了される。
+
+PID 名前空間間には階層構造が形成される。
+新しい PID 名前空間が作成されると、その名前空間のプロセスは、
+新しい名前空間を作成したプロセスの PID 名前空間で見える。
+同様に、親の PID 名前空間自体が別の PID 名前空間の子供の場合には、
+子供の PID 名前空間と親の PID 名前空間のプロセスはどれも
+親の親の PID 名前空間でも見えることになる。
+反対に、「子供」の PID 名前空間のプロセスには、
+親の名前空間のプロセスは見えない。
+名前空間に階層構造が存在するということは、個々のプロセスは
+複数の PID を持つということを意味している。
+そのプロセスが見える名前空間一つにつき PID が一つあり、
+それぞれの PID は対応する名前空間において一意である。
.RB ( getpid (2)
-¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¾ï¤Ë¤½¤Î¥×¥í¥»¥¹¤¬Â¸ºß¤·¤Æ¤¤¤ë̾Á°¶õ´Ö¤Ë¤ª¤±¤ë
-PID ¤¬ÊÖ¤µ¤ì¤ë¡£)
+を呼び出すと、常にそのプロセスが存在している名前空間における
+PID が返される。)
-¿·¤·¤¤Ì¾Á°¶õ´Ö¤ÎºîÀ®¸å¤Ë¤Ï¡¢
-»Ò¥×¥í¥»¥¹¤Ë¤ª¤¤¤Æ¡¢
+新しい名前空間の作成後には、
+子プロセスにおいて、
.BR ps (1)
-¤È¤¤¤Ã¤¿¥Ä¡¼¥ë¤¬Àµ¤·¤¯Æ°ºî¤¹¤ë¤è¤¦¤Ë¡¢
-¼«¿È¤Î root ¥Ç¥£¥ì¥¯¥È¥ê¤òÊѹ¹¤·¡¢
+といったツールが正しく動作するように、
+自身の root ディレクトリを変更し、
.I /proc
-¤Ë¿·¤·¤¤ procfs ¥¤¥ó¥¹¥¿¥ó¥¹¤ò¥Þ¥¦¥ó¥È¤¹¤ë¤Î¤¬¤è¤¤¤À¤í¤¦¡£
+に新しい procfs インスタンスをマウントするのがよいだろう。
.\" mount -t proc proc /proc
.RB ( flags
-¤Ë
+に
.B CLONE_NEWNS
-¤â»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¤Ë¤Ï¡¢root ¥Ç¥£¥ì¥¯¥È¥ê¤òÊѹ¹¤¹¤ëɬÍפϤʤ¯¡¢
-¤¤¤¤Ê¤ê¿·¤·¤¤ procfs ¥¤¥ó¥¹¥¿¥ó¥¹¤ò
+も指定されていた場合には、root ディレクトリを変更する必要はなく、
+いきなり新しい procfs インスタンスを
.I /proc
-¤Ë¥Þ¥¦¥ó¥È¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£)
+にマウントすることができる。)
-¤³¤Î¥Õ¥é¥°¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢
-¥«¡¼¥Í¥ë¤Ç¥ª¥×¥·¥ç¥ó
+このフラグを使用するためには、
+カーネルでオプション
.B CONFIG_PID_NS
-¤ò͸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¡¢
-¥×¥í¥»¥¹¤¬Æø¢
+を有効になっていること、
+プロセスが特権
.RB ( CAP_SYS_ADMIN )
-¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬É¬ÍפǤ¢¤ë¡£
-¤³¤Î¥Õ¥é¥°¤Ï
+を持っていることが必要である。
+このフラグは
.B CLONE_THREAD
-¤ÈÁȤ߹ç¤ï¤»¤Æ»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¤¡£
+と組み合わせて使うことはできない。
.TP
-.BR CLONE_NEWUTS " (Linux 2.6.19 °Ê¹ß)"
+.BR CLONE_NEWUTS " (Linux 2.6.19 以降)"
.B CLONE_NEWUTS
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¿·¤·¤¤ UTS ̾Á°¶õ´Ö¤Ç¥×¥í¥»¥¹¤òºîÀ®¤¹¤ë¡£
-¿·¤·¤¤ UTS ̾Á°¶õ´Ö¤Î¼±Ê̻Ҥνé´üÃͤϡ¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Î
-UTS ̾Á°¶õ´Ö¤Î¼±Ê̻ҤòÊ£À½¤·¤¿¤â¤Î¤È¤Ê¤ë¡£
-¤³¤Î¥Õ¥é¥°¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢
+が設定された場合、新しい UTS 名前空間でプロセスを作成する。
+新しい UTS 名前空間の識別子の初期値は、呼び出し元のプロセスの
+UTS 名前空間の識別子を複製したものとなる。
+このフラグが設定されていない場合、
.RB ( fork (2)
-¤Î¾ì¹ç¤ÈƱÍÍ) ¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤ÈƱ¤¸ UTS ̾Á°¶õ´Ö¤Ç
-¥×¥í¥»¥¹¤¬ºîÀ®¤µ¤ì¤ë¡£
-¤³¤Î¥Õ¥é¥°¤Ï¡¢¥³¥ó¥Æ¥Ê¤Î¼ÂÁõ¤Ç¤Î»ÈÍѤò°Õ¿Þ¤·¤ÆÍÑ°Õ¤µ¤ì¤¿¤â¤Î¤Ç¤¢¤ë¡£
+の場合と同様) 呼び出し元のプロセスと同じ UTS 名前空間で
+プロセスが作成される。
+このフラグは、コンテナの実装での使用を意図して用意されたものである。
-UTS ̾Á°¶õ´Ö¤Ï¡¢
+UTS 名前空間は、
.BR uname (2)
-¤¬ÊÖ¤¹¼±Ê̻Ҥν¸¹ç¤Ç¤¢¤ë¡£
-¼±Ê̻ҤȤ·¤Æ¤Ï¥É¥á¥¤¥ó̾¤È¥Û¥¹¥È̾¤¬¤¢¤ê¡¢
-¤½¤ì¤¾¤ì
+が返す識別子の集合である。
+識別子としてはドメイン名とホスト名があり、
+それぞれ
.BR setdomainname (2),
.BR sethostname (2)
-¤Ç½¤Àµ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
-¤¢¤ë UTS ̾Á°¶õ´Ö¤Ë¤ª¤±¤ë¼±Ê̻ҤÎÊѹ¹¤ÏƱ¤¸Ì¾Á°¶õ´Ö¤Î¾¤Î¤¹¤Ù¤Æ¤Î
-¥×¥í¥»¥¹¤Ë¸«¤¨¤ë¤¬¡¢Ê̤ΠUTS ̾Á°¶õ´Ö¤Î¥×¥í¥»¥¹¤Ë¤Ï¸«¤¨¤Ê¤¤¡£
+で修正することができる。
+ある UTS 名前空間における識別子の変更は同じ名前空間の他のすべての
+プロセスに見えるが、別の UTS 名前空間のプロセスには見えない。
-¤³¤Î¥Õ¥é¥°¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢
-¥«¡¼¥Í¥ë¤Ç¥ª¥×¥·¥ç¥ó
+このフラグを使用するためには、
+カーネルでオプション
.B CONFIG_UTS_NS
-¤ò͸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¡¢
-¥×¥í¥»¥¹¤¬Æø¢
+を有効になっていること、
+プロセスが特権
.RB ( CAP_SYS_ADMIN )
-¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬É¬ÍפǤ¢¤ë¡£
+を持っていることが必要である。
.TP
-.BR CLONE_PARENT " (Linux 2.3.12 °Ê¹ß)"
+.BR CLONE_PARENT " (Linux 2.3.12 以降)"
.B CLONE_PARENT
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¿·¤·¤¤»Ò¶¡¤Î
+が設定された場合、新しい子供の
.RB ( getppid (2)
-¤ÇÊÖ¤µ¤ì¤ë) ¿Æ¥×¥í¥»¥¹¤Ï¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Î¿Æ¥×¥í¥»¥¹¤ÈƱ¤¸¤Ë¤Ê¤ë¡£
+で返される) 親プロセスは呼び出し元のプロセスの親プロセスと同じになる。
.B CLONE_PARENT
-¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢
+が設定されていない場合、
.RB ( fork (2)
-¤ÈƱÍͤË) ¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤¬¤½¤Î»Ò¶¡¤Î¿Æ¤Ë¤Ê¤ë¡£
+と同様に) 呼び出し元のプロセスがその子供の親になる。
-»Ò¶¡¤¬½ªÎ»¤·¤¿»þ¤Ë¥·¥°¥Ê¥ë¤¬Á÷¤é¤ì¤ë¤Î¤Ï
+子供が終了した時にシグナルが送られるのは
.BR getppid (2)
-¤¬ÊÖ¤¹¿Æ¥×¥í¥»¥¹¤Ç¤¢¤ëÅÀ¤ËÃí°Õ¤¹¤ë¤³¤È¡£¤³¤Î¤¿¤á
+が返す親プロセスである点に注意すること。このため
.B CLONE_PARENT
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Ç¤Ï¤Ê¤¯¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Î
-¿Æ¥×¥í¥»¥¹¤Ë¥·¥°¥Ê¥ë¤¬Á÷¤é¤ì¤ë¡£
+が設定された場合、呼び出し元のプロセスではなく呼び出し元のプロセスの
+親プロセスにシグナルが送られる。
.TP
-.BR CLONE_PARENT_SETTID " (Linux 2.5.49 °Ê¹ß)"
-¿Æ¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹¤Î¥á¥â¥êÆâ¤Î
+.BR CLONE_PARENT_SETTID " (Linux 2.5.49 以降)"
+親プロセスと子プロセスのメモリ内の
.I ptid
-¤¬»Ø¤¹Îΰè¤Ë»Ò¥×¥í¥»¥¹¤Î¥¹¥ì¥Ã¥É ID ¤ò³ÊǼ¤¹¤ë¡£
-(Linux 2.5.32-2.5.48 ¤Ç¤Ï¡¢
-Ʊ¤¸¤³¤È¤ò¤¹¤ë
+が指す領域に子プロセスのスレッド ID を格納する。
+(Linux 2.5.32-2.5.48 では、
+同じことをする
.B CLONE_SETTID
-¤È¤¤¤¦¥Õ¥é¥°¤¬Â¸ºß¤·¤¿¡£)
+というフラグが存在した。)
.TP
-.BR CLONE_PID " (ÇÑ»ßͽÄê)"
+.BR CLONE_PID " (廃止予定)"
.B CLONE_PID
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢»Ò¥×¥í¥»¥¹¤Ï¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤ÈƱ¤¸¥×¥í¥»¥¹ ID
-¤ÇºîÀ®¤µ¤ì¤ë¡£¤³¤ì¤Ï¥·¥¹¥Æ¥à¤ò¥Ï¥Ã¥¥ó¥°¤¹¤ë¤Î¤Ë¤ÏÊØÍø¤À¤¬¡¢
-¤½¤ì°Ê³°¤Ë¤Ï¤¢¤Þ¤ê»È¤ï¤ì¤Ê¤¤¡£ Linux 2.3.21 °Ê¹ß¤Ç¤Ï¡¢
-¥·¥¹¥Æ¥à¤Î¥Ö¡¼¥È¥×¥í¥»¥¹ (PID 0) ¤À¤±¤¬¤³¤Î¥Õ¥é¥°¤ò»ØÄê¤Ç¤¤ë¡£
-Linux 2.5.16 ¤Çºï½ü¤µ¤ì¤¿¡£
+ã\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ã\83\97ã\83ã\82»ã\82¹ ID
+で作成される。これはシステムをハッキングするのには便利だが、
+それ以外にはあまり使われない。 Linux 2.3.21 以降では、
+システムのブートプロセス (PID 0) だけがこのフラグを指定できる。
+Linux 2.5.16 で削除された。
.TP
.B CLONE_PTRACE
.B CLONE_PTRACE
-¤¬»ØÄꤵ¤ì¡¢¤«¤Ä¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤¬ÄÉÀ× (trace) ¤µ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢»Ò¥×¥í¥»¥¹¤â
-ƱÍͤËÄÉÀפµ¤ì¤ë¡£
+が指定され、かつ呼び出し元のプロセスが追跡 (trace) されていた場合、子プロセスも
+同様に追跡される。
.RB ( ptrace (2)
-¤ò»²¾È¤Î¤³¤È)
+を参照のこと)
.TP
-.BR CLONE_SETTLS " (Linux 2.5.32 °Ê¹ß)"
+.BR CLONE_SETTLS " (Linux 2.5.32 以降)"
.I newtls
-°ú¤¿ô¤Ï¡¢¿·¤·¤¤ TLS (Thread Local Storage) ¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ç¤¢¤ë¡£
+引き数は、新しい TLS (Thread Local Storage) ディスクリプタである。
.RB ( set_thread_area (2)
-¤ò»²¾È¤Î¤³¤È)
+を参照のこと)
.TP
.B CLONE_SIGHAND
.B CLONE_SIGHAND
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹¤ÏƱ¤¸¥·¥°¥Ê¥ë¡¦¥Ï¥ó
-¥É¥é¤Î¥Æ¡¼¥Ö¥ë¤ò¶¦Í¤¹¤ë¡£¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Þ¤¿¤Ï»Ò¥×¥í¥»¥¹¤Î¤É¤Á¤é¤«¤¬
+が設定された場合、呼び出し元のプロセスと子プロセスは同じシグナル・ハン
+ドラのテーブルを共有する。呼び出し元のプロセスまたは子プロセスのどちらかが
.BR sigaction (2)
-¤ò¸Æ¤Ó½Ð¤·¤Æ¥·¥°¥Ê¥ë¤ËÂбþ¤¹¤ëÆ°ºî¤òÊѹ¹¤·¤¿¾ì¹ç¡¢
-¤â¤¦°ìÊý¤Î¥×¥í¥»¥¹¤Î¥·¥°¥Ê¥ëÆ°ºî¤âÊѹ¹¤µ¤ì¤ë¡£
-⤷¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹¤Ï¡¢
-¥×¥í¥»¥¹Ëè¤Ë¡¢¥·¥°¥Ê¥ë¡¦¥Þ¥¹¥¯ (signal mask) ¤È½èÍýÂÔ¤Á¥·¥°¥Ê¥ë¤Î½¸¹ç
-¤ò»ý¤Ã¤Æ¤¤¤ë¡£¤³¤Î¤¿¤á¡¢¤¢¤ë¥×¥í¥»¥¹¤Ï¡¢
+を呼び出してシグナルに対応する動作を変更した場合、
+もう一方のプロセスのシグナル動作も変更される。
+但し、呼び出し元のプロセスと子プロセスは、
+プロセス毎に、シグナル・マスク (signal mask) と処理待ちシグナルの集合
+を持っている。このため、あるプロセスは、
.BR sigprocmask (2)
-¤ò»ÈÍѤ·¤Æ¡¢¤â¤¦°ìÊý¤Î¥×¥í¥»¥¹¤Ë±Æ¶Á¤òÍ¿¤¨¤º¤Ë
-¥·¥°¥Ê¥ë¤ò¶Ø»ß (block) ¤·¤¿¤êµö²Ä (unblock) ¤·¤¿¤ê¤Ç¤¤ë¡£
+を使用して、もう一方のプロセスに影響を与えずに
+シグナルを禁止 (block) したり許可 (unblock) したりできる。
.B CLONE_SIGHAND
-¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢»Ò¥×¥í¥»¥¹¤Ï
+が設定されていない場合、子プロセスは
.BR clone ()
-¤¬¼Â¹Ô¤µ¤ì¤¿»þÅÀ¤Ç¤Î¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Î¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤Î
-¥³¥Ô¡¼¤ò·Ñ¾µ¤¹¤ë¡£¤³¤ì°Ê¹ß¤Ï¡¢°ìÊý¤Î¥×¥í¥»¥¹¤¬
+が実行された時点での、呼び出し元のプロセスのシグナル・ハンドラの
+コピーを継承する。これ以降は、一方のプロセスが
.BR sigaction (2)
-¤ò¸Æ¤Ó½Ð¤·¤Æ¤â¡¢¤â¤¦°ìÊý¤Î¥×¥í¥»¥¹¤Ë¤Ï±Æ¶Á¤òÍ¿¤¨¤Ê¤¤¡£
+を呼び出しても、もう一方のプロセスには影響を与えない。
-Linux 2.6.0-test6 °Ê¹ß¤Ç¤Ï¡¢
+Linux 2.6.0-test6 以降では、
.B CLONE_SIGHAND
-¤ò»ØÄꤹ¤ë¾ì¹ç¡¢
+を指定する場合、
.B CLONE_VM
-¤â
+も
.I flags
-¤Ë´Þ¤á¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
+に含めなければならない。
.TP
-.BR CLONE_STOPPED " (Linux 2.6.0-test2 °Ê¹ß)"
+.BR CLONE_STOPPED " (Linux 2.6.0-test2 以降)"
.B CLONE_STOPPED
-¤¬ÀßÄꤵ¤ì¤ë¤È¡¢»Ò¥×¥í¥»¥¹¤ÏºÇ½é
+が設定されると、子プロセスは最初
.RB ( SIGSTOP
-¥·¥°¥Ê¥ë¤òÁ÷¤é¤ì¤¿¤«¤Î¤è¤¦¤Ë) Ää»ß¤·¤¿¾õÂ֤Ȥʤ롣
-»Ò¥×¥í¥»¥¹¤òºÆ³«¤µ¤»¤ë¤Ë¤Ï
+シグナルを送られたかのように) 停止した状態となる。
+子プロセスを再開させるには
.B SIGCONT
-¥·¥°¥Ê¥ë¤òÁ÷¿®¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
+シグナルを送信しなければならない。
-.I "Linux 2.6.25 °Ê¹ß¡¢¤³¤Î¥Õ¥é¥°¤ÏÈó¿ä¾©¤Ç¤¢¤ë¡£"
-¤³¤Î¥Õ¥é¥°¤ò»È¤¤¤¿¤¤¤È»×¤¦¤³¤È¤Ï·è¤·¤Æ¤Ê¤¤¤À¤í¤¦¤·¡¢
-³Î¼Â¤Ë»È¤ï¤Ê¤¤¤è¤¦¤Ë¤¹¤Ù¤¤Ç¤¢¤ë¡£
-¤³¤Î¥Õ¥é¥°¤Ï¶á¤¤¤¦¤Á¤Ë¤Ê¤¯¤Ê¤ë¤³¤È¤À¤í¤¦¡£
+.I "Linux 2.6.25 以降、このフラグは非推奨である。"
+このフラグを使いたいと思うことは決してないだろうし、
+確実に使わないようにすべきである。
+このフラグは近いうちになくなることだろう。
.\" glibc 2.8 removed this defn from bits/sched.h
.TP
-.BR CLONE_SYSVSEM " (Linux 2.5.10 °Ê¹ß)"
+.BR CLONE_SYSVSEM " (Linux 2.5.10 以降)"
.B CLONE_SYSVSEM
-¤¬¥»¥Ã¥È¤µ¤ì¤ë¤È¡¢»Ò¥×¥í¥»¥¹¤È¸Æ¤Ó½Ð¤·¸µ¥×¥í¥»¥¹¤Ï°ì¤Ä¤Î
-System V ¥»¥Þ¥Õ¥©¤Î¥¢¥ó¥É¥¥Ãͥꥹ¥È
+がセットされると、子プロセスと呼び出し元プロセスは一つの
+System V セマフォのアンドゥ値リスト
.RB ( semop (2)
-»²¾È) ¤ò¶¦Í¤¹¤ë¡£¤³¤Î¥Õ¥é¥°¤¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢
-»Ò¥×¥í¥»¥¹¤ÏÆȼ«¤Î¥¢¥ó¥É¥¥¥ê¥¹¥È¤ò»ý¤Ä (¥ê¥¹¥È¤Î½é´üÃͤ϶õ¤Ç¤¢¤ë)¡£
+参照) を共有する。このフラグがセットされていなければ、
+子プロセスは独自のアンドゥリストを持つ (リストの初期値は空である)。
.TP
-.BR CLONE_THREAD " (Linux 2.4.0-test8°Ê¹ß)"
+.BR CLONE_THREAD " (Linux 2.4.0-test8以降)"
.B CLONE_THREAD
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢»Ò¥×¥í¥»¥¹¤Ï¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤ÈƱ¤¸¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë
-ÃÖ¤«¤ì¤ë¡£
+が設定された場合、子プロセスは呼び出し元のプロセスと同じスレッド・グループに
+置かれる。
.B CLONE_THREAD
-¤Ë¤Ä¤¤¤Æ¤Î°Ê¹ß¤ÎµÄÏÀ¤òÆɤߤ䤹¤¯¤¹¤ë¤¿¤á¡¢
-¡Ö¥¹¥ì¥Ã¥É¡×¤È¤¤¤¦ÍѸì¤Ï¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤ÎÃæ¤Î¥×¥í¥»¥¹¤ò
-»²¾È¤¹¤ë¤Î¤Ë»È¤¦¤³¤È¤È¤¹¤ë¡£
-
-¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ï¡¢ ¥¹¥ì¥Ã¥É½¸¹ç¤Ç°ì¤Ä¤Î PID ¤ò¶¦Í¤¹¤ë¤È¤¤¤¦ POSIX
-¥¹¥ì¥Ã¥É¤Î³µÇ°¤ò¥µ¥Ý¡¼¥È¤¹¤ë¤¿¤á¤Ë Linux 2.4 ¤Ë²Ã¤¨¤é¤ì¤¿µ¡Ç½¤Ç¤¢¤Ã¤¿¡£
-ÆâÉôŪ¤Ë¤Ï¡¢¤³¤Î¶¦Í PID ¤Ï¤¤¤ï¤æ¤ë¤½¤Î¥¹¥ì¥Ã¥É¥°¥ë¡¼¥×¤Î
-¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¼±ÊÌ»Ò (TGID) ¤Ç¤¢¤ë¡£
-Linux 2.4 °Ê¹ß¤Ç¤Ï¡¢
+についての以降の議論を読みやすくするため、
+「スレッド」という用語はスレッド・グループの中のプロセスを
+参照するのに使うこととする。
+
+スレッド・グループは、 スレッド集合で一つの PID を共有するという POSIX
+スレッドの概念をサポートするために Linux 2.4 に加えられた機能であった。
+内部的には、この共有 PID はいわゆるそのスレッドグループの
+スレッド・グループ識別子 (TGID) である。
+Linux 2.4 以降では、
.BR getpid (2)
-¤Î¸Æ¤Ó½Ð¤·¤Ç¤Ï¤½¤Î¥×¥í¥»¥¹¤Î¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥× ID ¤òÊÖ¤¹¡£
+の呼び出しではそのプロセスのスレッド・グループ ID を返す。
-¤¢¤ë¥°¥ë¡¼¥×¤Ë°¤¹¤ë¥¹¥ì¥Ã¥É¤Ï (¥·¥¹¥Æ¥àÁ´ÂΤÇ) °ì°Õ¤Ê¥¹¥ì¥Ã¥É ID (TID)
-¤Ç¶èÊ̤Ǥ¤ë¡£¿·¤·¤¤¥¹¥ì¥Ã¥É¤Î TID ¤Ï
+あるグループに属するスレッドは (システム全体で) 一意なスレッド ID (TID)
+で区別できる。新しいスレッドの TID は
.BR clone ()
-¤Î¸Æ¤Ó½Ð¤·¸µ¤Ø´Ø¿ô¤Î·ë²Ì¤È¤·¤ÆÊÖ¤µ¤ì¡¢
-¥¹¥ì¥Ã¥É¤Ï¼«Ê¬¼«¿È¤Î TID ¤ò
+の呼び出し元へ関数の結果として返され、
+スレッドは自分自身の TID を
.BR gettid (2)
-¤Ç¼èÆÀ¤Ç¤¤ë¡£
+で取得できる。
.B CLONE_THREAD
-¤ò»ØÄꤻ¤º¤Ë
+を指定せずに
.BR clone ()
-¤Î¸Æ¤Ó½Ð¤·¤¬¹Ô¤ï¤ì¤ë¤È¡¢
-À¸À®¤µ¤ì¤¿¥¹¥ì¥Ã¥É¤Ï¤½¤Î¥¹¥ì¥Ã¥É¤Î TID ¤ÈƱ¤¸ÃͤΠTGID ¤ò»ý¤Ä
-¿·¤·¤¤¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤ËÃÖ¤«¤ì¤ë¡£¤³¤Î¥¹¥ì¥Ã¥É¤Ï
-¿·¤·¤¤¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Î¡Ö¥ê¡¼¥À¡¼¡×¤Ç¤¢¤ë¡£
+の呼び出しが行われると、
+生成されたスレッドはそのスレッドの TID と同じ値の TGID を持つ
+新しいスレッド・グループに置かれる。このスレッドは
+新しいスレッド・グループの「リーダー」である。
.B CLONE_THREAD
-¤ò»ØÄꤷ¤ÆºîÀ®¤µ¤ì¤¿¿·¤·¤¤¥¹¥ì¥Ã¥É¤Ï¡¢
+を指定して作成された新しいスレッドは、
.RB ( CLONE_PARENT
-¤Î¾ì¹ç¤ÈƱÍͤË)
+の場合と同様に)
.BR clone ()
-¤ò¸Æ¤Ó½Ð¤·¸µ¤ÈƱ¤¸¿Æ¥×¥í¥»¥¹¤ò»ý¤Ä¡£
-¤½¤Î¤¿¤á¡¢
+を呼び出し元と同じ親プロセスを持つ。
+そのため、
.BR getppid (2)
-¤ò¸Æ¤Ö¤È¡¢°ì¤Ä¤Î¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë°¤¹¥¹¥ì¥Ã¥É¤ÏÁ´¤ÆƱ¤¸ÃͤòÊÖ¤¹¡£
+を呼ぶと、一つのスレッド・グループに属すスレッドは全て同じ値を返す。
.B CLONE_THREAD
-¤Çºî¤é¤ì¤¿¥¹¥ì¥Ã¥É¤¬½ªÎ»¤·¤¿ºÝ¤Ë¡¢
-¤½¤Î¥¹¥ì¥Ã¥É¤ò
+で作られたスレッドが終了した際に、
+そのスレッドを
.BR clone ()
-¤ò»È¤Ã¤ÆÀ¸À®¤·¤¿¥¹¥ì¥Ã¥É¤Ë¤Ï
+を使って生成したスレッドには
.B SIGCHLD
-(¤â¤·¤¯¤Ï¾¤Î½ªÎ»¥·¥°¥Ê¥ë) ¤ÏÁ÷¿®¤µ¤ì¤Ê¤¤¡£
-¤Þ¤¿¡¢
+(もしくは他の終了シグナル) は送信されない。
+また、
.BR wait (2)
-¤ò»È¤Ã¤Æ½ªÎ»¤·¤¿¥¹¥ì¥Ã¥É¤Î¾õÂÖ¤ò¼èÆÀ¤¹¤ë¤³¤È¤â¤Ç¤¤Ê¤¤
-(¤½¤Î¤è¤¦¤Ê¥¹¥ì¥Ã¥É¤Ï
+を使って終了したスレッドの状態を取得することもできない
+(そのようなスレッドは
.I detached
-(ʬΥ¤µ¤ì¤¿) ¤È¤¤¤ï¤ì¤ë)¡£
+(分離された) といわれる)。
-¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë°¤¹Á´¤Æ¤Î¥¹¥ì¥Ã¥É¤¬½ªÎ»¤·¤¿¸å¡¢
-¤½¤Î¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Î¿Æ¥×¥í¥»¥¹¤Ë
+スレッド・グループに属す全てのスレッドが終了した後、
+そのスレッド・グループの親プロセスに
.B SIGCHLD
-(¤â¤·¤¯¤Ï¾¤Î½ªÎ»¥·¥°¥Ê¥ë) ¤¬Á÷¤é¤ì¤ë¡£
+(もしくは他の終了シグナル) が送られる。
-¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë°¤¹¤¤¤º¤ì¤«¤Î¥¹¥ì¥Ã¥É¤¬
+スレッド・グループに属すいずれかのスレッドが
.BR execve (2)
-¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¡¦¥ê¡¼¥À¡¼°Ê³°¤ÎÁ´¤Æ¤Î¥¹¥ì¥Ã¥É¤Ï
-½ªÎ»¤µ¤ì¡¢¿·¤·¤¤¥×¥í¥»¥¹¤¬¤½¤Î¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¡¦¥ê¡¼¥À¡¼¤Î²¼¤Ç
-¼Â¹Ô¤µ¤ì¤ë¡£
+を実行すると、スレッド・グループ・リーダー以外の全てのスレッドは
+終了され、新しいプロセスがそのスレッド・グループ・リーダーの下で
+実行される。
-¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë°¤¹¥¹¥ì¥Ã¥É¤Î°ì¤Ä¤¬
+スレッド・グループに属すスレッドの一つが
.BR fork (2)
-¤ò»È¤Ã¤Æ»Ò¥×¥í¥»¥¹¤òºîÀ®¤·¤¿¾ì¹ç¡¢
-¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Î¤É¤Î¥¹¥ì¥Ã¥É¤Ç¤¢¤Ã¤Æ¤â
-¤½¤Î»Ò¶¡¤ò
+を使って子プロセスを作成した場合、
+スレッド・グループのどのスレッドであっても
+その子供を
.BR wait (2)
-¤Ç¤¤ë¡£
+できる。
-Linux 2.5.35 °Ê¹ß¤Ç¤Ï¡¢
+Linux 2.5.35 以降では、
.B CLONE_THREAD
-¤ò»ØÄꤹ¤ë¾ì¹ç¡¢
+を指定する場合、
.I flags
-¤Ë
+に
.B CLONE_SIGHAND
-¤â´Þ¤Þ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
+も含まれていなければならない。
.BR kill (2)
-¤ò»È¤Ã¤Æ¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×Á´ÂÎ (¤Ä¤Þ¤ê TGID) ¤Ë¥·¥°¥Ê¥ë¤òÁ÷¤ë¤³¤È¤â¤Ç¤¤ì¤Ð¡¢
+を使ってスレッド・グループ全体 (つまり TGID) にシグナルを送ることもできれば、
.BR tgkill (2)
-¤ò»È¤Ã¤ÆÆÃÄê¤Î¥¹¥ì¥Ã¥É (¤Ä¤Þ¤ê TID) ¤Ë¥·¥°¥Ê¥ë¤òÁ÷¤ë¤³¤È¤â¤Ç¤¤ë¡£
+を使って特定のスレッド (つまり TID) にシグナルを送ることもできる。
-¥·¥°¥Ê¥ë¤ÎÇÛÁ÷¤È½èÍý¤Ï¥×¥í¥»¥¹Á´ÂΤ˱ƶÁ¤¹¤ë:
-¥Ï¥ó¥É¥é¤òÀßÄꤷ¤Æ¤¤¤Ê¤¤¥·¥°¥Ê¥ë¤¬¤¢¤ë¥¹¥ì¥Ã¥É¤ËÇÛÁ÷¤µ¤ì¤ë¤È¡¢
-¤½¤Î¥·¥°¥Ê¥ë¤Ï¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤ÎÁ´¥á¥ó¥Ð¡¼¤Ë±Æ¶Á¤òµÚ¤Ü¤¹
-(½ªÎ»¤·¤¿¤ê¡¢Ää»ß¤·¤¿¤ê¡¢Æ°ºî¤ò·Ñ³¤·¤¿¤ê¡¢Ìµ»ë¤µ¤ì¤¿¤ê¤¹¤ë)¡£
+シグナルの配送と処理はプロセス全体に影響する:
+ハンドラを設定していないシグナルがあるスレッドに配送されると、
+そのシグナルはスレッド・グループの全メンバーに影響を及ぼす
+(終了したり、停止したり、動作を継続したり、無視されたりする)。
-³Æ¡¹¤Î¥¹¥ì¥Ã¥É¤ÏÆȼ«¤Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤ò»ý¤Ã¤Æ¤ª¤ê¡¢
+各々のスレッドは独自のシグナルマスクを持っており、
.BR sigprocmask (2)
-¤ÇÀßÄê¤Ç¤¤ë¡£
-¤À¤¬¡¢½èÍýÂÔ¤Á¤Î¥·¥°¥Ê¥ë¤Ë¤Ï¡¢
+で設定できる。
+だが、処理待ちのシグナルには、
.BR kill (2)
-¤ÇÁ÷¿®¤µ¤ì¤ë¥×¥í¥»¥¹Á´ÂΤËÂФ¹¤ë¤â¤Î (¤Ä¤Þ¤ê¡¢¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Î
-¤É¤Î¥á¥ó¥Ð¡¼¤Ë¤âÇÛÁ÷¤Ç¤¤ë¤â¤Î) ¤È¡¢
+で送信されるプロセス全体に対するもの (つまり、スレッド・グループの
+どのメンバーにも配送できるもの) と、
.BR tgkill (2)
-¤ÇÁ÷¿®¤µ¤ì¤ë¸Ä¡¹¤Î¥¹¥ì¥Ã¥É¤ËÂФ¹¤ë¤â¤Î¤¬¤¢¤ê¤¨¤ë¡£
+で送信される個々のスレッドに対するものがありえる。
.BR sigpending (2)
-¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¥×¥í¥»¥¹Á´ÂΤËÂФ¹¤ë½èÍýÂÔ¤Á¥·¥°¥Ê¥ë¤È¸Æ¤Ó½Ð¤·¸µ¤Î
-¥¹¥ì¥Ã¥É¤ËÂФ¹¤ë½èÍýÂÔ¤Á¥·¥°¥Ê¥ë¤ò·ë¹ç¤·¤¿¥·¥°¥Ê¥ë½¸¹ç¤¬ÊÖ¤µ¤ì¤ë¡£
+を呼び出すと、プロセス全体に対する処理待ちシグナルと呼び出し元の
+スレッドに対する処理待ちシグナルを結合したシグナル集合が返される。
.BR kill (2)
-¤ò»È¤Ã¤Æ¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë¥·¥°¥Ê¥ë¤¬Á÷¤é¤ì¤¿¾ì¹ç¤Ç¡¢
-¤½¤Î¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤¬¤½¤Î¥·¥°¥Ê¥ë¤ËÂФ¹¤ë¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤¬
-ÅÐÏ¿¤µ¤ì¤Æ¤¤¤¿¤È¤¤Ë¤Ï¡¢¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤Ï¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Î
-¥á¥ó¥Ð¡¼¤Î¤¦¤Á¡¢¤¿¤À°ì¤Ä¤Î¥¹¥ì¥Ã¥É¤Ç¤À¤±µ¯Æ°¤µ¤ì¤ë¡£¥Ï¥ó¥É¥é¤¬
-µ¯Æ°¤µ¤ì¤ë¥¹¥ì¥Ã¥É¤Ï¡¢¤½¤Î¥·¥°¥Ê¥ë¤ò¶Ø»ß (block) ¤·¤Æ¤¤¤Ê¤¤
-¥á¥ó¥Ð¡¼¤ÎÃ椫¤é°ì¤Ä¤À¤±¤¬¾¡¼ê¤Ë (arbitrarily) Áª¤Ð¤ì¤ë¡£
-¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë°¤¹Ê£¿ô¤Î¥¹¥ì¥Ã¥É¤¬
+を使ってスレッド・グループにシグナルが送られた場合で、
+そのスレッド・グループがそのシグナルに対するシグナル・ハンドラが
+登録されていたときには、シグナル・ハンドラはスレッド・グループの
+メンバーのうち、ただ一つのスレッドでだけ起動される。ハンドラが
+起動されるスレッドは、そのシグナルを禁止 (block) していない
+メンバーの中から一つだけが勝手に (arbitrarily) 選ばれる。
+スレッド・グループに属す複数のスレッドが
.BR sigwaitinfo (2)
-¤ò»È¤Ã¤ÆƱ¤¸¥·¥°¥Ê¥ë¤òÂԤäƤ¤¤ë¾ì¹ç¡¢
-¤³¤ì¤é¤Î¥¹¥ì¥Ã¥É¤ÎÃ椫¤é°ì¤Ä¤ò¥«¡¼¥Í¥ë¤¬¾¡¼ê¤ËÁªÂò¤·¡¢
-¤½¤Î¥¹¥ì¥Ã¥É¤¬
+を使って同じシグナルを待っている場合、
+これらのスレッドの中から一つをカーネルが勝手に選択し、
+そのスレッドが
.B kill (2)
-¤ò»È¤Ã¤ÆÁ÷¿®¤µ¤ì¤¿¥·¥°¥Ê¥ë¤ò¼õ¿®¤¹¤ë¡£
+を使って送信されたシグナルを受信する。
.TP
-.BR CLONE_UNTRACED " (Linux 2.5.46 °Ê¹ß)"
+.BR CLONE_UNTRACED " (Linux 2.5.46 以降)"
.B CLONE_UNTRACED
-¤¬»ØÄꤵ¤ì¤ë¤È¡¢ trace ¤ò¹Ô¤Ã¤Æ¤¤¤ë¥×¥í¥»¥¹¤Ï
-¤³¤Î»Ò¥×¥í¥»¥¹¤Ë
+が指定されると、 trace を行っているプロセスは
+この子プロセスに
.B CLONE_PTRACE
-¤òŬÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¡£
+を適用することができない。
.TP
.B CLONE_VFORK
.B CLONE_VFORK
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢
+が設定された場合、
.RB ( vfork (2)
-¤ÈƱÍͤË) »Ò¥×¥í¥»¥¹¤¬
+と同様に) 子プロセスが
.BR execve (2)
-¤Þ¤¿¤Ï
+または
.BR _exit (2)
-¤Ë¤è¤Ã¤Æ²¾ÁÛ¥á¥â¥ê¤ò²òÊü¤¹¤ë¤Þ¤Ç¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Î¼Â¹Ô¤ÏÄä»ß¤µ¤ì¤ë¡£
+によって仮想メモリを解放するまで、呼び出し元のプロセスの実行は停止される。
.B CLONE_VFORK
-¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢
+が設定されていない場合、
.BR clone ()
-¸Æ¤Ó½Ð¤·¸å¤Ï¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹¤Î
-ξÊý¤¬¥¹¥±¥¸¥å¡¼¥ëÂоݤȤʤꡢ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¤³¤ì¤é¤Î¥×¥í¥»¥¹¤Î
-¼Â¹Ô½ç½ø¤Ë°Í¸¤·¤Ê¤¤¤è¤¦¤Ë¤¹¤Ù¤¤Ç¤¢¤ë¡£
+呼び出し後は、呼び出し元のプロセスと子プロセスの
+両方がスケジュール対象となり、アプリケーションはこれらのプロセスの
+実行順序に依存しないようにすべきである。
.TP
.B CLONE_VM
.B CLONE_VM
-¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹¤ÏƱ¤¸¥á¥â¥ê¶õ´Ö¤Ç
-¼Â¹Ô¤µ¤ì¤ë¡£Æäˡ¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤ä»Ò¥×¥í¥»¥¹¤Î°ìÊý¤¬¥á¥â¥ê¤Ë
-½ñ¤¹þ¤ó¤ÀÆâÍƤϤ⤦°ìÊý¤Î¥×¥í¥»¥¹¤«¤é¤â¸«¤ë¤³¤È¤¬¤Ç¤¤ë¡£¤µ¤é¤Ë¡¢
-»Ò¥×¥í¥»¥¹¤ä¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤Î°ìÊý¤¬
+が設定された場合、呼び出し元のプロセスと子プロセスは同じメモリ空間で
+実行される。特に、呼び出し元のプロセスや子プロセスの一方がメモリに
+書き込んだ内容はもう一方のプロセスからも見ることができる。さらに、
+子プロセスや呼び出し元のプロセスの一方が
.BR mmap (2)
-¤ä
+や
.BR munmap (2)
-¤ò»È¤Ã¤Æ¥á¥â¥ê¤ò¥Þ¥Ã¥×¤·¤¿¤ê¥¢¥ó¥Þ¥Ã¥×¤·¤¿¾ì¹ç¡¢
-¤â¤¦°ìÊý¤Î¥×¥í¥»¥¹¤Ë¤â±Æ¶Á¤¬µÚ¤Ö¡£
+を使ってメモリをマップしたりアンマップした場合、
+もう一方のプロセスにも影響が及ぶ。
.B CLONE_VM
-¤¬ÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢»Ò¥×¥í¥»¥¹¤Ï
+が設定されていない場合、子プロセスは
.BR clone ()
-¤¬¼Â¹Ô¤µ¤ì¤¿»þÅÀ¤Ç¤Î¡¢¿Æ¥×¥í¥»¥¹¤Î¥á¥â¥ê¶õ´Ö¤ò¥³¥Ô¡¼¤·¤¿
-Ê̤Υá¥â¥ê¶õ´Ö¤Ç¼Â¹Ô¤µ¤ì¤ë¡£
-°ìÊý¤Î¥×¥í¥»¥¹¤¬¹Ô¤Ã¤¿¥á¥â¥ê¤Ø¤Î½ñ¤¹þ¤ß¤ä
-¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ã¥×/¥¢¥ó¥Þ¥Ã¥×¤Ï¡¢
+が実行された時点での、親プロセスのメモリ空間をコピーした
+別のメモリ空間で実行される。
+一方のプロセスが行ったメモリへの書き込みや
+ファイルのマップ/アンマップは、
.BR fork (2)
-¤Î¾ì¹ç¤ÈƱÍÍ¡¢¤â¤¦°ìÊý¤Î¥×¥í¥»¥¹¤Ë¤Ï±Æ¶Á¤·¤Ê¤¤¡£
+の場合と同様、もう一方のプロセスには影響しない。
.SS "sys_clone"
.B sys_clone
-¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï¡¢¤è¤ê
+システムコールは、より
.BR fork (2)
-¤Ë¶á¤¤¤«¤¿¤Á¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢»Ò¥×¥í¥»¥¹¤Î¼Â¹Ô¤¬¸Æ¤Ó½Ð¤·¤¬¹Ô¤ï¤ì¤¿¾ì½ê¤«¤é
-³¤±¤é¤ì¤ë¡£
-¤½¤Î¤¿¤á¡¢
+に近いかたちになっており、子プロセスの実行が呼び出しが行われた場所から
+続けられる。
+そのため、
.B sys_clone
-¤¬É¬ÍפȤ¹¤ë°ú¤¿ô¤Ï
+が必要とする引き数は
.I flags
-¤È
+と
.I child_stack
-¤À¤±¤Ç¤¢¤ê¡¢¤½¤ì¤é¤Ï
+だけであり、それらは
.BR clone ()
-¤ÈƱ¤¸°ÕÌ£¤ò»ý¤Ä
-(¤³¤ì¤é¤Î°ú¤¿ô¤Î½çÈÖ¤Ï
+と同じ意味を持つ
+(これらの引き数の順番は
.BR clone ()
-¤È¤Ï°Û¤Ê¤ë¤³¤È¤ËÃí°Õ¤»¤è)¡£
+とは異なることに注意せよ)。
.B sys_clone
-¤Î¤â¤¦°ì¤Ä¤Î°ã¤¤¤Ï¡¢
+のもう一つの違いは、
.I child_stack
-°ú¤¿ô¤¬¥¼¥í¤Ç¤âÎɤ¤¤³¤È¤Ç¤¢¤ë¡£¤³¤Î¾ì¹ç¤Ë¤Ï¡¢¤É¤Á¤é¤«¤Î¥×¥í¥»¥¹¤¬
-¥¹¥¿¥Ã¥¯¤òÊѹ¹¤·¤¿»þ¤Ë¡¢½ñ¤¹þ¤ß»þ¥³¥Ô¡¼ (copy-on-write) Êý¼°¤Ë¤è¤ê
-»Ò¥×¥í¥»¥¹¤¬¥¹¥¿¥Ã¥¯¡¦¥Ú¡¼¥¸¤ÎÆÈΩ¤·¤¿¥³¥Ô¡¼¤òÆÀ¤é¤ì¤ë¤³¤È¤¬Êݾڤµ¤ì¤ë¡£
-¤³¤Î¾ì¹ç¡¢Àµ¾ï¤ËÆ°ºî¤µ¤»¤ë¤¿¤á¤Ë¤Ï¡¢
+引き数がゼロでも良いことである。この場合には、どちらかのプロセスが
+スタックを変更した時に、書き込み時コピー (copy-on-write) 方式により
+子プロセスがスタック・ページの独立したコピーを得られることが保証される。
+この場合、正常に動作させるためには、
.B CLONE_VM
-¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+オプションを指定してはならない。
-Linux 2.4 °ÊÁ°¤Ç¤Ï¡¢
+Linux 2.4 以前では、
.BR clone ()
-¤Ï°ú¤¿ô
+は引き数
.IR ptid ,
.IR tls ,
.IR ctid
-¤ò¼è¤é¤Ê¤¤¡£
-.SH ÊÖ¤êÃÍ
-.\" gettid(2) ¤Ï current->pid ¤òÊÖ¤¹
-.\" getpid(2) ¤Ï current->tgid ¤òÊÖ¤¹
-À®¸ù¤·¤¿¾ì¹ç¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¼Â¹Ô¥¹¥ì¥Ã¥É¤Ë¤Ï»Ò¥×¥í¥»¥¹¤Î¥¹¥ì¥Ã¥ÉID ¤¬ÊÖ¤µ¤ì¤ë¡£
-¼ºÇÔ¤·¤¿¾ì¹ç¡¢ ¸Æ¤Ó½Ð¤·¸µ¤Î¥³¥ó¥Æ¥¥¹¥È¤Ë¤Ï \-1 ¤¬ÊÖ¤µ¤ì¡¢»Ò¥×¥í¥»¥¹¤Ï
-ºîÀ®¤µ¤ì¤º¡¢
+を取らない。
+.SH 返り値
+.\" gettid(2) は current->pid を返す
+.\" getpid(2) は current->tgid を返す
+成功した場合、呼び出し元の実行スレッドには子プロセスのスレッドID が返される。
+失敗した場合、 呼び出し元のコンテキストには \-1 が返され、子プロセスは
+作成されず、
.I errno
-¤¬Å¬ÀÚ¤ËÀßÄꤵ¤ì¤ë¡£
-.SH ¥¨¥é¡¼
+が適切に設定される。
+.SH ã\82¨ã\83©ã\83¼
.TP
.B EAGAIN
-¤¹¤Ç¤Ë¼Â¹ÔÃæ¤Î¥×¥í¥»¥¹¤¬Â¿¤¹¤®¤ë¡£
+すでに実行中のプロセスが多すぎる。
.TP
.B EINVAL
.B CLONE_SIGHAND
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤¿¤¬¡¢
+が指定されていたが、
.B CLONE_VM
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¡£
-(Linux 2.6.0-test6 °Ê¹ß)
+が指定されていなかった。
+(Linux 2.6.0-test6 以降)
.TP
.B EINVAL
.B CLONE_THREAD
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤¿¤¬¡¢
+が指定されていたが、
.B CLONE_SIGHAND
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¡£
-(Linux 2.5.35 °Ê¹ß)
+が指定されていなかった。
+(Linux 2.5.35 以降)
.\" .TP
.\" .B EINVAL
.\" .B CLONE_DETACHED
-.\" ¤È
+.\" と
.\" .B CLONE_THREAD
-.\" ¤Î¤¤¤º¤ì¤«°ìÊý¤À¤±¤¬»ØÄꤵ¤ì¤¿¡£
-.\" (Linux 2.6.0-test6 °Ê¹ß)
+.\" のいずれか一方だけが指定された。
+.\" (Linux 2.6.0-test6 以降)
.TP
.B EINVAL
.B CLONE_FS
-¤È
+と
.B CLONE_NEWNS
-¤ÎξÊý¤¬
+の両方が
.I flags
-¤Ë»ØÄꤵ¤ì¤¿¡£
+に指定された。
.TP
.B EINVAL
.B CLONE_NEWIPC
-¤È
+と
.B CLONE_SYSVSEM
-¤ÎξÊý¤¬
+の両方が
.I flags
-¤Ë»ØÄꤵ¤ì¤¿¡£
+に指定された。
.TP
.B EINVAL
.B CLONE_NEWPID
-¤È
+と
.B CLONE_THREAD
-¤ÎξÊý¤¬
+の両方が
.I flags
-¤Ë»ØÄꤵ¤ì¤¿¡£
+に指定された。
.TP
.B EINVAL
.I child_stack
-¤Ë¥¼¥í¤ò»ØÄꤷ¤¿¾ì¹ç¤Ë
+にゼロを指定した場合に
.BR clone ()
-¤¬ÊÖ¤¹¡£
+が返す。
.TP
.B EINVAL
.I flags
-¤Ë
+に
.B CLONE_NEWIPC
-¤¬»ØÄꤵ¤ì¤¿¤¬¡¢¥«¡¼¥Í¥ë¤Ç¥ª¥×¥·¥ç¥ó
+が指定されたが、カーネルでオプション
.B CONFIG_SYSVIPC
-¤È
+と
.B CONFIG_IPC_NS
-¤¬Í¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Ê¤«¤Ã¤¿¡£
+が有効になっていなかった。
.TP
.B EINVAL
.I flags
-¤Ë
+に
.B CLONE_NEWNET
-¤¬»ØÄꤵ¤ì¤¿¤¬¡¢¥«¡¼¥Í¥ë¤Ç¥ª¥×¥·¥ç¥ó
+が指定されたが、カーネルでオプション
.B CONFIG_NET_NS
-¤¬Í¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Ê¤«¤Ã¤¿¡£
+が有効になっていなかった。
.TP
.B EINVAL
.I flags
-¤Ë
+に
.B CLONE_NEWPID
-¤¬»ØÄꤵ¤ì¤¿¤¬¡¢¥«¡¼¥Í¥ë¤Ç¥ª¥×¥·¥ç¥ó
+が指定されたが、カーネルでオプション
.B CONFIG_PID_NS
-¤¬Í¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Ê¤«¤Ã¤¿¡£
+が有効になっていなかった。
.TP
.B EINVAL
.I flags
-¤Ë
+に
.B CLONE_NEWUTS
-¤¬»ØÄꤵ¤ì¤¿¤¬¡¢¥«¡¼¥Í¥ë¤Ç¥ª¥×¥·¥ç¥ó
+が指定されたが、カーネルでオプション
.B CONFIG_UTS
-¤¬Í¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Ê¤«¤Ã¤¿¡£
+が有効になっていなかった。
.TP
.B ENOMEM
-»Ò¥×¥í¥»¥¹¤Î¤¿¤á¤Ë³ÎÊݤ¹¤Ù¤¥¿¥¹¥¯¹½Â¤ÂΤ䡢¸Æ¤Ó½Ð¤·¸µ¤Î¥³¥ó¥Æ¥¥¹¥È¤Î
-°ìÉô¤ò¥³¥Ô¡¼¤¹¤ë¤Î¤ËɬÍפʥá¥â¥ê¤ò½½Ê¬¤Ë³ä¤êÅö¤Æ¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¡£
+子プロセスのために確保すべきタスク構造体や、呼び出し元のコンテキストの
+一部をコピーするのに必要なメモリを十分に割り当てることができない。
.TP
.B EPERM
-ÈóÆø¢¥×¥í¥»¥¹ (\fBCAP_SYS_ADMIN\fP ¤ò»ý¤¿¤Ê¤¤¥×¥í¥»¥¹) ¤¬
+非特権プロセス (\fBCAP_SYS_ADMIN\fP を持たないプロセス) が
.BR CLONE_NEWIPC ,
.BR CLONE_NEWNET ,
.BR CLONE_NEWNS ,
.BR CLONE_NEWPID ,
.BR CLONE_NEWUTS
-¤ò»ØÄꤷ¤¿¡£
+を指定した。
.TP
.B EPERM
-PID ¤¬ 0 °Ê³°¤Î¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ
+PID が 0 以外のプロセスによって
.B CLONE_PID
-¤¬»ØÄꤵ¤ì¤¿¡£
-.SH ¥Ð¡¼¥¸¥ç¥ó
-libc5 ¤Ë¤Ï
+が指定された。
+.SH バージョン
+libc5 には
.BR clone ()
-¤Ï¤Ê¤¤¡£glibc2 ¤Ç¤Ï
+はない。glibc2 では
.BR clone ()
-¤¬Ä󶡤µ¤ì¤Æ¤ª¤ê¡¢¤³¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ËµºÜ¤ÎÄ̤ê¤Ç¤¢¤ë¡£
-.SH ½àµò
+が提供されており、このマニュアルページに記載の通りである。
+.SH 準拠
.BR clone ()
-¤È
+と
.B sys_clone
-¥³¡¼¥ë¤Ï Linux ÆÃͤǤ¢¤ê¡¢°Ü¿¢¤ò¹Íθ¤·¤¿¥×¥í¥°¥é¥à¤Ç¤Ï»ÈÍѤ¹¤Ù¤
-¤Ç¤Ï¤Ê¤¤¡£
-.SH Ãí°Õ
-¥«¡¼¥Í¥ë 2.4.x ·ÏÎó¤Ç¤Ï¡¢°ìÈÌŪ¤Ë¤Ï
+コールは Linux 特有であり、移植を考慮したプログラムでは使用すべき
+ではない。
+.SH 注意
+カーネル 2.4.x 系列では、一般的には
.B CLONE_THREAD
-¥Õ¥é¥°¤ò»ØÄꤷ¤Æ¤â¿·¤·¤¤¥¹¥ì¥Ã¥É¤Î¿Æ¤ò
-¸Æ¤Ó½Ð¤·¸µ¥×¥í¥»¥¹¤Î¿Æ¤ÈƱ¤¸¤Ë¤Ï¤·¤Ê¤¤¡£
-¤·¤«¤·¡¢¥Ð¡¼¥¸¥ç¥ó 2.4.7¡Á2.4.18 ¤Î¥«¡¼¥Í¥ë¤Ç¤Ï¡¢
-(¥«¡¼¥Í¥ë 2.6 ¤ÈƱ¤¸¤è¤¦¤Ë) CLONE_THREAD ¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤È¡¢
-°ÅÌۤΤ¦¤Á¤Ë CLONE_PARENT ¥Õ¥é¥°¤ò»ØÄꤷ¤¿¤³¤È¤Ë¤Ê¤ë¡£
+フラグを指定しても新しいスレッドの親を
+呼び出し元プロセスの親と同じにはしない。
+しかし、バージョン 2.4.7〜2.4.18 のカーネルでは、
+(カーネル 2.6 と同じように) CLONE_THREAD フラグを指定すると、
+暗黙のうちに CLONE_PARENT フラグを指定したことになる。
.B CLONE_DETACHED
-¤È¤¤¤¦¥Õ¥é¥°¤¬¡¢2.5.32 ¤ÇƳÆþ¤µ¤ì¤Æ°ÊÍ褷¤Ð¤é¤¯¤Î´Ö¸ºß¤·¤¿¡£
-¤³¤Î¥Õ¥é¥°¤Ï¿Æ¥×¥í¥»¥¹¤¬»Ò¥×¥í¥»¥¹½ªÎ»¤Î¥·¥°¥Ê¥ë¤òɬÍפȤ·¤Ê¤¤¤³¤È¤ò
-ɽ¤¹¤â¤Î¤Ç¤¢¤ë¡£
-2.6.2 ¤Ç¡¢ CLONE_DETATCHED ¤ò CLONE_THREAD ¤È°ì½ï¤Ë»ØÄꤹ¤ëɬÍפϤʤ¯¤Ê¤Ã¤¿¡£
-¤³¤Î¥Õ¥é¥°¤Ï¤Þ¤ÀÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤¬¡¢²¿¤Î¸ú²Ì¤â¤Ê¤¤¡£
+というフラグが、2.5.32 で導入されて以来しばらくの間存在した。
+このフラグは親プロセスが子プロセス終了のシグナルを必要としないことを
+表すものである。
+2.6.2 で、 CLONE_DETATCHED を CLONE_THREAD と一緒に指定する必要はなくなった。
+このフラグはまだ定義されているが、何の効果もない。
-i386 ¾å¤Ç¤Ï¡¢
+i386 上では、
.BR clone ()
-¤Ï vsyscall ·Ðͳ¤Ç¤Ï¤Ê¤¯¡¢Ä¾ÀÜ
+は vsyscall 経由ではなく、直接
.I "int $0x80"
-·Ðͳ¤Ç¸Æ¤Ó½Ð¤¹¤Ù¤¤Ç¤¢¤ë¡£
+経由で呼び出すべきである。
-ia64 ¤Ç¤Ï¡¢Ê̤Υ·¥¹¥Æ¥à¥³¡¼¥ë¤¬»ÈÍѤµ¤ì¤ë:
+ia64 では、別のシステムコールが使用される:
.nf
.BI "int __clone2(int (*" "fn" ")(void *), "
.fi
.PP
.BR __clone2 ()
-¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï
+システムコールは
.BR clone ()
-¤ÈƱ¤¸¤è¤¦¤ËÆ°ºî¤¹¤ë¤¬¡¢°Ê²¼¤ÎÅÀ¤¬°Û¤Ê¤ë:
+と同じように動作するが、以下の点が異なる:
.I child_stack_base
-¤Ï»Ò¥×¥í¥»¥¹¤Î¥¹¥¿¥Ã¥¯¥¨¥ê¥¢¤ÎºÇ¾®¤Î¥¢¥É¥ì¥¹¤ò»Ø¤·¡¢
+は子プロセスのスタックエリアの最小のアドレスを指し、
.I stack_size
-¤Ï
+は
.I child_stack_base
-¤¬»Ø¤·¼¨¤¹¥¹¥¿¥Ã¥¯¥¨¥ê¥¢¤ÎÂ礤µ¤ò¼¨¤¹¡£
-.SH ¥Ð¥°
-NPTL ¥¹¥ì¥Ã¥É¡¦¥é¥¤¥Ö¥é¥ê¤ò´Þ¤ó¤Ç¤¤¤ë GNU C ¥é¥¤¥Ö¥é¥ê¤Î¤¤¤¯¤Ä¤«¤Î¥Ð¡¼¥¸¥ç¥ó
-¤Ë¤Ï¡¢
+が指し示すスタックエリアの大きさを示す。
+.SH ã\83\90ã\82°
+NPTL スレッド・ライブラリを含んでいる GNU C ライブラリのいくつかのバージョン
+には、
.BR getpid (2)
-¤Î¥é¥Ã¥Ñ¡¼´Ø¿ô¤¬´Þ¤Þ¤ì¤Æ¤ª¤ê¡¢¤³¤Î¥é¥Ã¥Ñ¡¼´Ø¿ô¤Ï PID ¤ò¥¥ã¥Ã¥·¥å¤¹¤ë¡£
-¤³¤Î¥¥ã¥Ã¥·¥å½èÍý¤¬Àµ¤·¤¯Æ°ºî¤¹¤ë¤¿¤á¤Ë¤Ï glibc ¤Î
+のラッパー関数が含まれており、このラッパー関数は PID をキャッシュする。
+このキャッシュ処理が正しく動作するためには glibc の
.BR clone ()
-¤Î¥é¥Ã¥Ñ¡¼´Ø¿ô¤Ç¤Î½õ¤±¤¬É¬ÍפÀ¤¬¡¢¸½¾õ¤Î¼ÂÁõ¤Ç¤Ï¡¢
-¤¢¤ë¾õ¶·²¼¤Ë¤ª¤¤¤Æ¥¥ã¥Ã¥·¥å¤¬ºÇ¿·¤È¤Ê¤é¤Ê¤¤²ÄǽÀ¤¬¤¢¤ë¡£
-Æäˡ¢
+のラッパー関数での助けが必要だが、現状の実装では、
+ある状況下においてキャッシュが最新とならない可能性がある。
+特に、
.BR clone ()
-¤Î¸Æ¤Ó½Ð¤·Ä¾¸å¤Ë¥·¥°¥Ê¥ë¤¬»Ò¥×¥í¥»¥¹¤ËÇÛÁ÷¤µ¤ì¤¿¾ì¹ç¤Ë¡¢
-¤½¤Î¥·¥°¥Ê¥ë¤ËÂФ¹¤ë¥Ï¥ó¥É¥éÆâ¤Ç
+の呼び出し直後にシグナルが子プロセスに配送された場合に、
+そのシグナルに対するハンドラ内で
.BR getpid (2)
-¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¤½¤ì¤Þ¤Ç¤Ë clone ¤Î¥é¥Ã¥Ñ¡¼´Ø¿ô¤¬»Ò¥×¥í¥»¥¹¤Î PID ¥¥ã¥Ã¥·¥å¤ò
-¹¹¿·¤¹¤ëµ¡²ñ¤¬ÆÀ¤é¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢¸Æ¤Ó½Ð¤·¸µ¥×¥í¥»¥¹ ("¿Æ¥×¥í¥»¥¹") ¤Î PID ¤¬
-ÊÖ¤µ¤ì¤ë²ÄǽÀ¤¬¤¢¤ë¡£
-(¤³¤ÎµÄÏÀ¤Ç¤Ï¡¢»Ò¥×¥í¥»¥¹¤¬
+を呼び出すと、それまでに clone のラッパー関数が子プロセスの PID キャッシュを
+更新する機会が得られていなければ、呼び出し元プロセス ("親プロセス") の PID が
+返される可能性がある。
+(この議論では、子プロセスが
.B CLONE_THREAD
-¤ò»È¤Ã¤ÆºîÀ®¤µ¤ì¤¿¾ì¹ç¤Î¤³¤È¤Ï̵»ë¤·¤Æ¤¤¤ë¡£
-»Ò¥×¥í¥»¥¹¤¬
+を使って作成された場合のことは無視している。
+子プロセスが
.B CLONE_THREAD
-¤òºî¤Ã¤ÆºîÀ®¤µ¤ì¤¿¾ì¹ç¤Ë¤Ï¡¢
-¸Æ¤Ó½Ð¤·¸µ¤È»Ò¥×¥í¥»¥¹¤ÏƱ¤¸¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë°¤¹¤Î¤Ç¡¢
+を作って作成された場合には、
+呼び出し元と子プロセスは同じスレッド・グループに属すので、
.BR getpid (2)
-¤Ï»Ò¥×¥í¥»¥¹¤È
+は子プロセスと
.BR clone ()
-¤ò¸Æ¤Ó½Ð¤·¤¿¥×¥í¥»¥¹¤ÇƱ¤¸ÃͤòÊÖ¤¹¤Î¤¬¡ÖÀµ¤·¤¤¡×¡£
-¥¥ã¥Ã¥·¥å¤¬ºÇ¿·¤È¤Ê¤é¤Ê¤¤ÌäÂê (stale-cache problem) ¤Ï¡¢
+を呼び出したプロセスで同じ値を返すのが「正しい」。
+キャッシュが最新とならない問題 (stale-cache problem) は、
.I flags
-¤Ë
+に
.B CLONE_VM
-¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤âȯÀ¸¤·¤Ê¤¤¡£)
-ËÜÅö¤ÎÃͤòÆÀ¤ë¤¿¤á¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ê¥³¡¼¥É¤ò»È¤¦É¬Íפ¬¤¢¤ë¤«¤â¤·¤ì¤Ê¤¤¡£
+が含まれている場合にも発生しない。)
+本当の値を得るためには、次のようなコードを使う必要があるかもしれない。
.nf
#include <syscall.h>
.\" 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 ´ØÏ¢¹àÌÜ
+.SH 関連項目
.BR fork (2),
.BR futex (2),
.BR getpid (2),