.\" Updated 2007-09-08, Akihiro MOTOKI, LDP v2.64
.\" Updated 2008-08-06, Akihiro MOTOKI, LDP v3.05
.\"
-.\"WORD: synchronous Ʊ´ü¤µ¤»¤ë
-.\"WORD: multiplexing ¿½Å²½
-.\"WORD: file descriptor ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿
-.\"WORD: descriptor µ½Ò»Ò
-.\"WORD: macro ¥Þ¥¯¥í
-.\"WORD: block Ää»ß(block)
-.\"WORD: block ¶Ø»ß(block)
-.\"WORD: signal ¥·¥°¥Ê¥ë
-.\"WORD: timeout »þ´ÖÀÚ¤ì(timeout)
-.\"WORD: portable °Ü¿¢À¤Î¤¢¤ë
+.\"WORD: synchronous 同期させる
+.\"WORD: multiplexing 多重化
+.\"WORD: file descriptor ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿
+.\"WORD: descriptor 記述子
+.\"WORD: macro マクロ
+.\"WORD: block 停止(block)
+.\"WORD: block 禁止(block)
+.\"WORD: signal シグナル
+.\"WORD: timeout 時間切れ(timeout)
+.\"WORD: portable 移植性のある
.\"
.TH SELECT 2 2010-08-31 "Linux" "Linux Programmer's Manual"
.\"O .SH NAME
-.SH ̾Á°
+.SH 名前
.\"O select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO \-
.\"O synchronous I/O multiplexing
-select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO \- ¿½Å²½¤µ¤ì¤¿ I/O ¤ÎƱ´ü¤ò¤È¤ë
+select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO \- 多重化された I/O の同期をとる
.\"O .SH SYNOPSIS
-.SH ½ñ¼°
+.SH 書式
.nf
.\"O /* According to POSIX.1-2001 */
-/* POSIX.1-2001 ¤Ë½¾¤¦¾ì¹ç */
+/* POSIX.1-2001 に従う場合 */
.br
.B #include <sys/select.h>
.sp
.\"O /* According to earlier standards */
-/* °ÊÁ°¤Îµ¬³Ê¤Ë½¾¤¦¾ì¹ç */
+/* 以前の規格に従う場合 */
.br
.B #include <sys/time.h>
.br
.in -4n
.\"O Feature Test Macro Requirements for glibc (see
.\"O .BR feature_test_macros (7)):
-glibc ¸þ¤±¤Îµ¡Ç½¸¡ºº¥Þ¥¯¥í¤ÎÍ×·ï
+glibc 向けの機能検査マクロの要件
.RB ( feature_test_macros (7)
-»²¾È):
+参照):
.in
.sp
.BR pselect ():
_POSIX_C_SOURCE\ >=\ 200112L || _XOPEN_SOURCE\ >=\ 600
.\"O .SH DESCRIPTION
-.SH ÀâÌÀ
+.SH 説明
.\"O .BR select ()
.\"O and
.\"O .BR pselect ()
.\"O .BR read (2))
.\"O without blocking.
.BR select ()
-¤ä
+や
.BR pselect ()
-¤ò»È¤¦¤È¡¢¥×¥í¥°¥é¥à¤ÇÊ£¿ô¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò´Æ»ë¤·¡¢
-°ì¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬¤¢¤ë¼ï¤Î I/O Áàºî¤Î
-¡Öready (½àÈ÷¤¬¤Ç¤¤¿)¡×¾õÂÖ (Î㤨¤Ð¡¢Æɤ߹þ¤ß²Äǽ¤Ë¤Ê¤Ã¤¿¾õÂÖ)
-¤Ë¤Ê¤ë¤Þ¤ÇÂԤĤ³¤È¤¬¤Ç¤¤ë¡£
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬ ready (½àÈ÷¤¬¤Ç¤¤¿) ¤È¤Ï¡¢
-Âбþ¤¹¤ë I/O Áàºî (Î㤨¤Ð
+を使うと、プログラムで複数のファイルディスクリプタを監視し、
+一つ以上のファイルディスクリプタがある種の I/O 操作の
+「ready (準備ができた)」状態 (例えば、読み込み可能になった状態)
+になるまで待つことができる。
+ファイルディスクリプタが ready (準備ができた) とは、
+対応する I/O 操作 (例えば
.BR read (2)
-¤Ê¤É) ¤¬Ää»ß (block) ¤Ê¤·¤Ë¼Â¹Ô²Äǽ¤Ê¾õÂ֤ˤ¢¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
+など) が停止 (block) なしに実行可能な状態にあることを意味する。
.PP
.\"O The operation of
.\"O .BR select ()
.\"O .BR pselect ()
.\"O is identical, with three differences:
.BR select ()
-¤È
+と
.BR pselect ()
-¤ÎÆ°ºî¤ÏƱ¤¸¤Ç¤¢¤ë¤¬¡¢°Ê²¼¤Î 3 ÅÀ¤¬°Û¤Ê¤ë:
+の動作は同じであるが、以下の 3 点が異なる:
.TP
(i)
.\"O .BR select ()
.\"O .I struct timespec
.\"O (with seconds and nanoseconds).
.BR select ()
-¤Ç¤Ï¡¢¥¿¥¤¥à¥¢¥¦¥È»þ´Ö¤Î»ØÄê¤Ë¹½Â¤ÂÎ
+では、タイムアウト時間の指定に構造体
.I struct timeval
-(Éᦥޥ¤¥¯¥íÉÃñ°Ì) ¤òÍѤ¤¤ë¡£
-°ìÊý¡¢
+(秒・マイクロ秒単位) を用いる。
+一方、
.BR pselect ()
-´Ø¿ô¤Ç¤Ï¡¢¹½Â¤ÂÎ
+関数では、構造体
.I struct timespec
-(ÉᦥʥÎÉÃñ°Ì) ¤òÍѤ¤¤ë¡£
+(秒・ナノ秒単位) を用いる。
.TP
(ii)
.\"O .BR select ()
.\"O .BR pselect ()
.\"O does not change this argument.
.BR select ()
-¤Ï»Ä¤ê»þ´Ö¤ò¼¨¤¹
+は残り時間を示す
.I timeout
-°ú¤¿ô¤ò¹¹¿·¤¹¤ë¤³¤È¤¬¤¢¤ë¡£
+引き数を更新することがある。
.BR pselect ()
-¤Ï¤³¤Î°ú¤¿ô¤òÊѹ¹¤·¤Ê¤¤¡£
+はこの引き数を変更しない。
.TP
(iii)
.\"O The
.\"O called with NULL
.\"O .IR sigmask .
.BR select ()
-¤Ï
+は
.I sigmask
-°ú¤¿ô¤ò»ý¤¿¤Ê¤¤¡£¤½¤ÎÆ°ºî¤Ï
+引き数を持たない。その動作は
.I sigmask
-¤Ë NULL ¤ò»ØÄꤷ¤¿¾ì¹ç¤Î
+に NULL を指定した場合の
.BR pselect ()
-¤ÈƱ¤¸¤Ç¤¢¤ë¡£
+と同じである。
.PP
.\"O Three independent sets of file descriptors are watched.
.\"O Those listed in
.\"O Each of the three file descriptor sets may be specified as NULL
.\"O if no file descriptors are to be watched for the corresponding class
.\"O of events.
-3 ¤Ä¤ÎÆÈΩ¤·¤¿¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤Î´Æ»ë¤ò¹Ô¤¦¡£
+3 つの独立したファイルディスクリプタ集合の監視を行う。
.I readfds
-¤ËÆþ¤ì¤é¤ì¤¿¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ë¤Ä¤¤¤Æ¤Ï¡¢Æɤ߹þ¤ß¤¬²Äǽ¤«¤É¤¦¤«¤ò
-´Æ»ë¤¹¤ë (¤è¤êÀµ³Î¤Ë¤¤¤¦¤È¡¢Ää»ß (block) ¤Ê¤·¤ÇÆɤळ¤È¤¬¤Ç¤¤ë¤«¤ò
-Ä´¤Ù¤ë¡£¥Õ¥¡¥¤¥ë¤Î½ªÃ¼ (end-of-file) ¤Î¾ì¹ç¤â¡¢
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ÏÆɤ߹þ¤ß²Äǽ¤È¤·¤Æ°·¤ï¤ì¤ë)¡£
+に入れられたディスクリプタについては、読み込みが可能かどうかを
+監視する (より正確にいうと、停止 (block) なしで読むことができるかを
+調べる。ファイルの終端 (end-of-file) の場合も、
+ファイルディスクリプタは読み込み可能として扱われる)。
.I writefds
-¤ËÆþ¤ì¤é¤ì¤¿¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ë¤Ä¤¤¤Æ¤Ï¡¢Ää»ß¤»¤º¤Ë½ñ¤¹þ¤ß¤¬
-²Äǽ¤«¤É¤¦¤«¤ò´Æ»ë¤¹¤ë¡£
+に入れられたディスクリプタについては、停止せずに書き込みが
+可能かどうかを監視する。
.I exceptfds
-¤Ë¤¢¤ë¤â¤Î¤Ë¤Ä¤¤¤Æ¤Ï¡¢Îã³°¤Î´Æ»ë¤ò¹Ô¤Ê¤¦¡£¥·¥¹¥Æ¥à¥³¡¼¥ë½ªÎ»»þ¤Ë¡¢
-¤É¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¾õÂÖ¤¬¼ÂºÝ¤ËÊѲ½¤·¤¿¤«¼¨¤¹¤¿¤á¤Ë¡¢
-½¸¹ç¤ÎÆâÍƤ¬Êѹ¹¤µ¤ì¤ë¡£
-¤¢¤ë¼ïÊ̤Υ¤¥Ù¥ó¥È¤ò´Æ»ë¤·¤¿¤¤¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬°ì¤Ä¤â¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢
-Âбþ¤¹¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤Ë NULL ¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤¤ë¡£
+にあるものについては、例外の監視を行なう。システムコール終了時に、
+どのファイルディスクリプタの状態が実際に変化したか示すために、
+集合の内容が変更される。
+ある種別のイベントを監視したいファイルディスクリプタが一つもない場合には、
+対応するファイルディスクリプタ集合に NULL を指定することができる。
.PP
.\"O Four macros are provided to manipulate the sets.
-½¸¹ç¤òÁàºî¤¹¤ë¤¿¤á¤Ë 4 ¤Ä¤Î¥Þ¥¯¥í¤¬Ä󶡤µ¤ì¤Æ¤¤¤ë¡£
+集合を操作するために 4 つのマクロが提供されている。
.\"O .BR FD_ZERO ()
.\"O clears a set.
.BR FD_ZERO ()
-¤Ï½¸¹ç¤ò¾Ãµî¤¹¤ë¡£
+は集合を消去する。
.\"O .BR FD_SET ()
.\"O and
.\"O .BR FD_CLR ()
.\"O respectively add and remove a given file descriptor from a set.
.BR FD_SET ()
-¤È
+と
.BR FD_CLR ()
-¤Ï¤½¤ì¤¾¤ì»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î½¸¹ç¤Ø¤ÎÄɲᢺï½ü¤ò¹Ô¤¦¡£
+はそれぞれ指定したファイルディスクリプタの集合への追加、削除を行う。
.\"O .BR FD_ISSET ()
.\"O tests to see if a file descriptor is part of the set;
.\"O this is useful after
.\"O .BR select ()
.\"O returns.
.BR FD_ISSET ()
-¤Ï½¸¹ç¤Ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬¤¢¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë;
-¤³¤Î¥Þ¥¯¥í¤Ï
+は集合にファイルディスクリプタがあるかどうか調べる;
+このマクロは
.BR select ()
-¤¬½ªÎ»¤·¤¿¸å¤Ë»È¤¦¤ÈÊØÍø¤Ç¤¢¤ë¡£
+が終了した後に使うと便利である。
.PP
.\"O .I nfds
.\"O is the highest-numbered file descriptor in any of the three sets, plus 1.
.I nfds
-¤Ï 3 ¤Ä¤Î½¸¹ç¤Ë´Þ¤Þ¤ì¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ÎºÇÂçÃÍ¤Ë 1 ¤ò¤·¤¿¤â¤Î¤Ç¤¢¤ë¡£
+は 3 つの集合に含まれるファイルディスクリプタの最大値に 1 を足したものである。
.PP
.\"O .I timeout
.\"O is an upper bound on the amount of time elapsed before
.\"O .BR select ()
.\"O can block indefinitely.
.I timeout
-¤Ï
+は
.BR select ()
-¤¬Éüµ¢¤¹¤ë¤Þ¤Ç¤Î·Ð²á»þ´Ö¤Î¾å¸Â¤Ç¤¢¤ë¡£
+が復帰するまでの経過時間の上限である。
.I timeval
-¹½Â¤ÂΤÎξÊý¤Î¥Õ¥£¡¼¥ë¥É¤¬ 0 ¤Î¾ì¹ç¡¢
+構造体の両方のフィールドが 0 の場合、
.BR select ()
-¤Ï¤¹¤°¤ËÉüµ¢¤¹¤ë
-(¤³¤Îµ¡Ç½¤Ï¥Ý¡¼¥ê¥ó¥° (polling) ¤ò¹Ô¤¦¤Î¤ËÊØÍø¤Ç¤¢¤ë)¡£
+はすぐに復帰する
+(この機能はポーリング (polling) を行うのに便利である)。
.I timeout
-¤Ë NULL (¥¿¥¤¥à¥¢¥¦¥È¤Ê¤·)
-¤¬»ØÄꤵ¤ì¤ë¤È¡¢
+に NULL (タイムアウトなし)
+が指定されると、
.BR select ()
-¤Ï̵´ü¸Â¤ËÄä»ß (block) ¤¹¤ë¡£
+は無期限に停止 (block) する。
.PP
.\"O .I sigmask
.\"O is a pointer to a signal mask (see
.\"O then does the "select" function, and then restores the original
.\"O signal mask.
.I sigmask
-¤Ï¡¢¥·¥°¥Ê¥ë¥Þ¥¹¥¯
+ã\81¯ã\80\81ã\82·ã\82°ã\83\8aã\83«ã\83\9eã\82¹ã\82¯
.RB ( sigprocmask (2)
-¤ò»²¾È) ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
+を参照) へのポインタである。
.I sigmask
-¤¬ NULL ¤Ç¤Ê¤¤¾ì¹ç¡¢
+が NULL でない場合、
.BR pselect ()
-¤Ï
+は
.I sigmask
-¤¬»Ø¤·¤Æ¤¤¤ë¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤Ç¸½ºß¤Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤òÃÖ¤´¹¤¨¤Æ¤«¤é¡¢
-"select" ´Ø¿ô¤ò¼Â¹Ô¤·¡¢
-½ªÎ»¸å¤Ë¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤ò¸µ¤Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤ËÌ᤹¡£
+が指しているシグナルマスクで現在のシグナルマスクを置き換えてから、
+"select" 関数を実行し、
+終了後にシグナルマスクを元のシグナルマスクに戻す。
.PP
.\"O Other than the difference in the precision of the
.\"O .I timeout
.\"O .BR pselect ()
.\"O call:
.I timeout
-°ú¤¿ô¤ÎÀºÅ٤ΰ㤤¤ò½ü¤¯¤È¡¢°Ê²¼¤Î
+引き数の精度の違いを除くと、以下の
.BR pselect ()
-¤Î¸Æ¤Ó½Ð¤·¤Ï¡¢
+の呼び出しは、
.nf
ready = pselect(nfds, &readfds, &writefds, &exceptfds,
.\"O is equivalent to
.\"O .I atomically
.\"O executing the following calls:
-¼¡¤Î¥³¡¼¥ë¤ò
+次のコールを
.I atomic
-¤Ë¼Â¹Ô¤¹¤ë¤Î¤ÈÅù²Á¤Ç¤¢¤ë¡£
+に実行するのと等価である。
.nf
sigset_t origmask;
.\"O could hang indefinitely if the signal arrived just after the test
.\"O but just before the call.
.BR pselect ()
-¤¬É¬ÍפˤʤëÍýͳ¤Ï¡¢¥·¥°¥Ê¥ë¤ä¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¾õÂÖÊѲ½¤ò
-ÂÔ¤Á¤¿¤¤¤È¤¤Ë¤Ï¡¢¶¥¹ç¾õÂÖ¤òÈò¤±¤ë¤¿¤á¤Ë atomic ¤Ê¥Æ¥¹¥È¤¬É¬Íפˤʤë
-¤«¤é¤Ç¤¢¤ë¡£
-(¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤¬Âç°è¥Õ¥é¥°¤òÀßÄꤷ¤ÆÌá¤ë¾ì¹ç¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡£
-¤³¤ÎÂç°è¥Õ¥é¥°¤Î¥Æ¥¹¥È¤Ë³¤±¤Æ
+が必要になる理由は、シグナルやファイルディスクリプタの状態変化を
+待ちたいときには、競合状態を避けるために atomic なテストが必要になる
+からである。
+(シグナルハンドラが大域フラグを設定して戻る場合を考えてみよう。
+この大域フラグのテストに続けて
.BR select ()
-¤ò¸Æ¤Ó½Ð¤¹¤È¡¢
-¥·¥°¥Ê¥ë¤¬¥Æ¥¹¥È¤Îľ¸å¤«¤Ä¸Æ¤Ó½Ð¤·¤ÎľÁ°¤ËÆϤ¤¤¿»þ¤Ë¤Ï
+を呼び出すと、
+シグナルがテストの直後かつ呼び出しの直前に届いた時には
.BR select ()
-¤Ï±Êµ×¤Ë¥Ï¥ó¥°¤·¤Æ¤·¤Þ¤¦¤«¤â¤·¤ì¤Ê¤¤¡£
+は永久にハングしてしまうかもしれない。
.\"O By contrast,
.\"O .BR pselect ()
.\"O allows one to first block signals, handle the signals that have come in,
.\"O with the desired
.\"O .IR sigmask ,
.\"O avoiding the race.)
-°ìÊý¡¢
+一方、
.BR pselect ()
-¤ò»È¤¦¤È¡¢¤Þ¤º¥·¥°¥Ê¥ë¤ò¶Ø»ß (block) ¤·¤Æ¡¢Æþ¤Ã¤Æ¤¯¤ë¥·¥°¥Ê¥ë¤òÁàºî¤·¡¢
-˾¤ß¤Î
+を使うと、まずシグナルを禁止 (block) して、入ってくるシグナルを操作し、
+望みの
.I sigmask
-¤Ç
+で
.BR pselect ()
-¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ç¡¢Á°µ¤Î¶¥¹ç¤òÈò¤±¤ë¤³¤È¤¬¤Ç¤¤ë¡£)
+を呼び出すことで、前記の競合を避けることができる。)
.\"O .SS "The timeout"
-.SS ¥¿¥¤¥à¥¢¥¦¥È
+.SS タイムアウト
.\"O The time structures involved are defined in
.\"O .I <sys/time.h>
.\"O and look like
-¤³¤ì¤é¤Î´Ø¿ô¤Ç»ÈÍѤµ¤ì¤ë»þ´Ö´ØÏ¢¤Î¹½Â¤ÂΤϡ¢
+これらの関数で使用される時間関連の構造体は、
.I <sys/time.h>
-¤Ç°Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£
+で以下のように定義されている。
.\"O .in +4n
.\"O .nf
.in +4n
.nf
struct timeval {
- long tv_sec; /* ÉÃ */
- long tv_usec; /* ¥Þ¥¤¥¯¥íÉà */
+ long tv_sec; /* 秒 */
+ long tv_usec; /* マイクロ秒 */
};
.fi
.in
.in +4n
.nf
struct timespec {
- long tv_sec; /* ÉÃ */
- long tv_nsec; /* ¥Ê¥ÎÉà */
+ long tv_sec; /* 秒 */
+ long tv_nsec; /* ナノ秒 */
};
.fi
.in
.\"O (However, see below on the POSIX.1-2001 versions.)
-(POSIX.1-2001 ¤Ç¤ÎÄêµÁ¤Ë¤Ä¤¤¤Æ¤Ï²¼µ¤Î¡ÖÃí°Õ¡×¤ò»²¾È)
+(POSIX.1-2001 での定義については下記の「注意」を参照)
.PP
.\"O Some code calls
.\"O .BR select ()
.\"O zero, and a non-NULL
.\"O .I timeout
.\"O as a fairly portable way to sleep with subsecond precision.
-ÉÃñ°Ì°Ê²¼¤ÎÀºÅ٤ǥ¹¥ê¡¼¥×¤ò¼Â¸½¤¹¤ë
-°Ü¿¢À¤Î¹â¤¤ÊýË¡¤È¤·¤Æ¡¢
-3 ¤Ä¤Î½¸¹çÁ´¤Æ¤ò¶õ¡¢
+秒単位以下の精度でスリープを実現する
+移植性の高い方法として、
+3 つの集合全てを空、
.I nfds
-¤ò 0 ¡¢
+を 0 、
.I timeout
-¤ò NULL ¤Ç¤Ê¤¤ÃͤËÀßÄꤷ¤Æ
+を NULL でない値に設定して
.BR select ()
-¤ò¸Æ¤Ó½Ð¤¹¤È¤¤¤¦ÊýË¡¤ò»È¤Ã¤Æ¤¤¤ë¥³¡¼¥É¤â¤¢¤ë¡£
+を呼び出すという方法を使っているコードもある。
.PP
.\"O On Linux,
.\"O .BR select ()
.\"O to be undefined after
.\"O .BR select ()
.\"O returns.
-Linux ¤Ç¤Ï¡¢
+Linux では、
.BR select ()
-¤Ï
+は
.I timeout
-¤òÊѹ¹¤·¡¢»Ä¤ê¤ÎÄä»ß»þ´Ö¤òÈ¿±Ç¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¬¡¢
-¾¤Î¤Û¤È¤ó¤É¤Î¼ÂÁõ¤Ç¤Ï¤³¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Ê¤¤
-(POSIX.1-2001 ¤Ï¤É¤Á¤é¤ÎÆ°ºî¤âǧ¤á¤Æ¤¤¤ë)¡£
-¤³¤Î¤¿¤á¡¢
+を変更し、残りの停止時間を反映するようになっているが、
+他のほとんどの実装ではこのようになっていない
+(POSIX.1-2001 はどちらの動作も認めている)。
+このため、
.I timeout
-¤ò»²¾È¤·¤Æ¤¤¤ë Linux ¤Î¥³¡¼¥É¤ò¾¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ø
-°Ü¿¢¤¹¤ë¾ì¹ç¡¢ÌäÂ꤬µ¯¤³¤ë¡£
-¤Þ¤¿¡¢¥ë¡¼¥×¤ÎÃæ¤Ç \fItimeval\fP ¹½Â¤ÂΤò½é´ü²½¤»¤º¤Ë¤½¤Î¤Þ¤ÞºÆÍøÍѤ·¤Æ
+を参照している Linux のコードを他のオペレーティング・システムへ
+移植する場合、問題が起こる。
+また、ループの中で \fItimeval\fP 構造体を初期化せずにそのまま再利用して
.BR select ()
-¤òÊ£¿ô²ó¹Ô¤Ê¤Ã¤Æ¤¤¤ë¥³¡¼¥É¤ò Linux ¤Ø°Ü¿¢¤¹¤ë¾ì¹ç¤Ë¤â¡¢ÌäÂ꤬µ¯¤³¤ë¡£
+を複数回行なっているコードを Linux へ移植する場合にも、問題が起こる。
.BR select ()
-¤«¤éÉüµ¢¤·¤¿¸å¤Ï
+から復帰した後は
.I timeout
-¤Ï̤ÄêµÁ¤Ç¤¢¤ë¤È¹Í¤¨¤ë¤Ù¤¤Ç¤¢¤ë¡£
+は未定義であると考えるべきである。
.\"O .\" .PP - it is rumored that:
.\"O .\" On BSD, when a timeout occurs, the file descriptor bits are not changed.
.\"O .\" - it is certainly true that:
.\"O .\" Linux follows SUSv2 and sets the bit masks to zero upon a timeout.
.\" .PP
-.\" ¡ÖBSD ¤Ç¤Ï¥¿¥¤¥à¥¢¥¦¥È¤¬µ¯¤³¤Ã¤Æ¤â¡¢
-.\" ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¥Ó¥Ã¥È¤ÏÊѤï¤é¤Ê¤¤¡×¤Èʹ¤¤¤¿¤³¤È¤¬¤¢¤ë¡£
-.\" ¡ÖLinux ¤Ï SUSv2 ¤Ë½¾¤Ã¤Æ¤ª¤ê¡¢
-.\" ¥¿¥¤¥à¥¢¥¦¥È¤ÎºÝ¤Ë¤Ï¥Ó¥Ã¥È¥Þ¥¹¥¯¤ò 0 ¤Ë¤¹¤ë¡×¤È¤¤¤¦¤Î¤Ï³Î¤«¤Ë»ö¼Â¤Ç¤¢¤ë¡£
+.\" 「BSD ではタイムアウトが起こっても、
+.\" ファイルディスクリプタビットは変わらない」と聞いたことがある。
+.\" 「Linux は SUSv2 に従っており、
+.\" タイムアウトの際にはビットマスクを 0 にする」というのは確かに事実である。
.\"O .SH "RETURN VALUE"
-.SH ÊÖ¤êÃÍ
+.SH 返り値
.\"O On success,
.\"O .BR select ()
.\"O and
.\"O .IR writefds ,
.\"O .IR exceptfds )
.\"O which may be zero if the timeout expires before anything interesting happens.
-À®¸ù¤·¤¿¾ì¹ç¡¢
+成功した場合、
.BR select ()
-¤È
+と
.BR pselect ()
-¤Ï¹¹¿·¤µ¤ì¤¿ 3 ¤Ä¤Î¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë
-¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¿ô (¤Ä¤Þ¤ê¡¢
+は更新された 3 つのディスクリプタ集合に含まれている
+ファイルディスクリプタの数 (つまり、
.IR readfds ,
.IR writefds ,
.I exceptfds
-Ãæ¤Î 1 ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥Ó¥Ã¥È¤ÎÁí¿ô) ¤òÊÖ¤¹¡£
-²¿¤âµ¯¤³¤é¤º¤Ë»þ´ÖÀÚ¤ì¤Ë¤Ê¤Ã¤¿¾ì¹ç¡¢
-¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¿ô¤Ï 0 ¤Ë¤Ê¤ë¤³¤È¤â¤¢¤ë¡£
+中の 1 になっているビットの総数) を返す。
+何も起こらずに時間切れになった場合、
+ディスクリプタの数は 0 になることもある。
.\"O On error, \-1 is returned, and
.\"O .I errno
.\"O is set appropriately; the sets and
.\"O .I timeout
.\"O become undefined, so do not
.\"O rely on their contents after an error.
-¥¨¥é¡¼¤Ê¤é¤Ð \-1 ¤òÊÖ¤·¡¢
+エラーならば \-1 を返し、
.I errno
-¤ËŬÀÚ¤ÊÃͤ¬ÀßÄꤵ¤ì¤ë; ½¸¹ç¤È
+に適切な値が設定される; 集合と
.I timeout
-¤Ï̤ÄêµÁ¤È¤Ê¤ë¤Î¤Ç¡¢¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿¸å¤Ï¤½¤ì¤é¤ÎÆâÍƤò¿®Íꤷ¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
+は未定義となるので、エラーが起こった後はそれらの内容を信頼してはならない。
.\"O .SH ERRORS
-.SH ¥¨¥é¡¼
+.SH ã\82¨ã\83©ã\83¼
.TP
.B EBADF
.\"O An invalid file descriptor was given in one of the sets.
.\"O (Perhaps a file descriptor that was already closed,
.\"O or one on which an error has occurred.)
-¤¤¤º¤ì¤«¤Î½¸¹ç¤Ë̵¸ú¤Ê¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬»ØÄꤵ¤ì¤¿
-(¤ª¤½¤é¤¯¤Ï¡¢¤¹¤Ç¤Ë¥¯¥í¡¼¥º¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤«¡¢
-¥¨¥é¡¼¤¬È¯À¸¤·¤¿¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬»ØÄꤵ¤ì¤¿)¡£
+いずれかの集合に無効なファイルディスクリプタが指定された
+(おそらくは、すでにクローズされたファイルディスクリプタか、
+エラーが発生したファイルディスクリプタが指定された)。
.TP
.B EINTR
.\"O A signal was caught; see
.\"O .BR signal (7).
-¥·¥°¥Ê¥ë¤ò¼õ¿®¤·¤¿¡£
+シグナルを受信した。
.TP
.B EINVAL
.\"O .I nfds
.\"O .I timeout
.\"O is invalid.
.I n
-¤¬Éé¡¢¤Þ¤¿¤Ï
+が負、または
.I timeout
-¤ËÆþ¤Ã¤Æ¤¤¤ëÃͤ¬ÉÔÀµ¤Ç¤¢¤ë¡£
+に入っている値が不正である。
.TP
.B ENOMEM
.\"O unable to allocate memory for internal tables.
-ÆâÉô¥Æ¡¼¥Ö¥ë¤Ë¥á¥â¥ê¤ò³ä¤êÅö¤Æ¤ë¤³¤È¤¬¤Ç¤¤Ê¤«¤Ã¤¿¡£
+内部テーブルにメモリを割り当てることができなかった。
.\"O .SH VERSIONS
-.SH ¥Ð¡¼¥¸¥ç¥ó
+.SH バージョン
.\"O .BR pselect ()
.\"O was added to Linux in kernel 2.6.16.
.BR pselect ()
-¤Ï¥«¡¼¥Í¥ë 2.6.16 ¤Ç Linux ¤ËÄɲ䵤줿¡£
+はカーネル 2.6.16 で Linux に追加された。
.\"O Prior to this,
.\"O .BR pselect ()
.\"O was emulated in glibc (but see BUGS).
-¤½¤ì°ÊÁ°¤Ï¡¢
+それ以前は、
.BR pselect ()
-¤Ï glibc ¤Ç¥¨¥ß¥å¥ì¡¼¥È¤µ¤ì¤Æ¤¤¤¿ (¡Ö¥Ð¥°¡×¤Î¾Ï¤ò»²¾È)¡£
+は glibc でエミュレートされていた (「バグ」の章を参照)。
.\"O .SH "CONFORMING TO"
-.SH ½àµò
+.SH 準拠
.\"O .BR select ()
.\"O conforms to POSIX.1-2001 and
.\"O 4.4BSD
.\"O However, note that the System V variant typically
.\"O sets the timeout variable before exit, but the BSD variant does not.
.BR select ()
-¤Ï POSIX.1-2001 ¤È 4.4BSD
+は POSIX.1-2001 と 4.4BSD
.RB ( select ()
-¤Ï 4.2BSD ¤ÇºÇ½é¤ËÅо줷¤¿) ¤Ë½àµò¤¹¤ë¡£
-BSD ¥½¥±¥Ã¥ÈÁؤΥ¯¥í¡¼¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ëÈó BSD ¥·¥¹¥Æ¥à
-(System V ·Ï¤â´Þ¤à) ¤È¤Î´Ö¤Ç¤À¤¤¤¿¤¤°Ü¿¢À¤¬¤¢¤ë¡£¤·¤«¤· System V ·Ï¤Ç¤Ï
-¤¿¤¤¤¬¤¤ timeout ÊÑ¿ô¤ò exit ¤ÎÁ°¤Ë¥»¥Ã¥È¤¹¤ë¤¬¡¢
-BSD ·Ï¤Ç¤Ï¤½¤¦¤Ç¤Ê¤¤¤Î¤ÇÃí°Õ¤¹¤ë¤³¤È¡£
+は 4.2BSD で最初に登場した) に準拠する。
+BSD ソケット層のクローンをサポートしている非 BSD システム
+(System V 系も含む) との間でだいたい移植性がある。しかし System V 系では
+たいがい timeout 変数を exit の前にセットするが、
+BSD 系ではそうでないので注意すること。
.PP
.\"O .BR pselect ()
.\"O is defined in POSIX.1g, and in
.\"O POSIX.1-2001.
.BR pselect ()
-¤Ï POSIX.1g ¤È POSIX.1-2001 ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£
+は POSIX.1g と POSIX.1-2001 で定義されている。
.\"O .SH NOTES
-.SH Ãí°Õ
+.SH 注意
.\"O An
.\"O .I fd_set
.\"O is a fixed size buffer.
.\"O .I fd
.\"O to be a valid file descriptor.
.I fd_set
-¤Ï¸ÇÄꥵ¥¤¥º¤Î¥Ð¥Ã¥Õ¥¡¤Ç¤¢¤ë¡£
-Éé¤ä
+は固定サイズのバッファである。
+負や
.B FD_SETSIZE
-°Ê¾å¤ÎÃͤò»ý¤Ä
+以上の値を持つ
.I fd
-¤ËÂФ·¤Æ
+に対して
.BR FD_CLR ()
-¤ä
+や
.BR FD_SET ()
-¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢
-¤É¤Î¤è¤¦¤ÊÆ°ºî¤ò¤¹¤ë¤«¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¡£
-¤Þ¤¿¡¢ POSIX ¤Ç¤Ï
+を実行した場合、
+どのような動作をするかは定義されていない。
+また、 POSIX では
.I fd
-¤Ï͸ú¤Ê¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Èµ¬Äꤵ¤ì¤Æ¤¤¤ë¡£
+は有効なファイルディスクリプタでなければならないと規定されている。
.\"O Concerning the types involved, the classical situation is that
.\"O the two fields of a
.\"O .I long
.\"O (as shown above), and the structure is defined in
.\"O .IR <sys/time.h> .
-·¿Àë¸À¤Ë´Ø¤·¤Æ¤Ï¡¢ÀΤʤ¬¤é¤Î¾õ¶·¤Ç¤Ï
+型宣言に関しては、昔ながらの状況では
.I timeval
-¹½Â¤ÂΤΠ2 ¤Ä¤Î¥Õ¥£¡¼¥ë¥É¤Ï
-(¾åµ¤Î¤è¤¦¤Ë) ξÊý¤È¤â
+構造体の 2 つのフィールドは
+(上記のように) 両方とも
.I long
-·¿¤Ç¤¢¤ê¡¢¹½Â¤ÂΤÏ
+型であり、構造体は
.I <sys/time.h>
-¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£
+で定義されている。
.\"O The POSIX.1-2001 situation is
.\"O
.\"O .in +4n
.\"O .I suseconds_t
.\"O are defined in
.\"O .IR <sys/types.h> .
-POSIX.1-2001 ¤Î²¼¤Ç¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£
+POSIX.1-2001 の下では、以下のようになっている。
.in +4n
.nf
struct timeval {
- time_t tv_sec; /* ÉÃ */
- suseconds_t tv_usec; /* ¥Þ¥¤¥¯¥íÉà */
+ time_t tv_sec; /* 秒 */
+ suseconds_t tv_usec; /* マイクロ秒 */
};
.fi
.in
-¤³¤Î¹½Â¤ÂΤÏ
+この構造体は
.I <sys/select.h>
-¤ÇÄêµÁ¤µ¤ì¤Æ¤ª¤ê¡¢¥Ç¡¼¥¿·¿
+で定義されており、データ型
.I time_t
-¤È
+と
.I suseconds_t
-¤Ï
+は
.I <sys/types.h>
-¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£
+で定義されている。
.LP
.\"O Concerning prototypes, the classical situation is that one should
.\"O include
.\"O .I <time.h>
.\"O for
.\"O .BR select ().
-¥×¥í¥È¥¿¥¤¥×¤Ë´Ø¤·¤Æ¤Ï¡¢ÀΤʤ¬¤é¤Î¾õ¶·¤Ç
+プロトタイプに関しては、昔ながらの状況で
.BR select ()
-¤ò»È¤¤¤¿¤¤¾ì¹ç¤Ï¡¢
+を使いたい場合は、
.I <time.h>
-¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ì¤Ð¤è¤¤¡£
+をインクルードすればよい。
.\"O The POSIX.1-2001 situation is that one should include
.\"O .I <sys/select.h>
.\"O for
.\"O .BR select ()
.\"O and
.\"O .BR pselect ().
-POSIX.1-2001 ¤Î´Ä¶¤Ç
+POSIX.1-2001 の環境で
.BR select ()
-¤È
+と
.BR pselect ()
-¤ò»È¤¤¤¿¤¤¾ì¹ç¤Ï¡¢
+を使いたい場合は、
.I <sys/select.h>
-¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ì¤Ð¤è¤¤¡£
+をインクルードすればよい。
.\"O Libc4 and libc5 do not have a
.\"O .I <sys/select.h>
.\"O header; under glibc 2.0 and later this header exists.
-¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë
+ヘッダファイル
.I <sys/select.h>
-¤Ï libc4 ¤È libc5 ¤Ë¤Ï¤Ê¤¯¡¢glibc 2.0 °Ê¹ß¤Ë¸ºß¤¹¤ë¡£
+は libc4 と libc5 にはなく、glibc 2.0 以降に存在する。
.\"O Under glibc 2.0 it unconditionally gives the wrong prototype for
.\"O .BR pselect ().
.\"O Under glibc 2.1 to 2.2.1 it gives
.\"O .B _GNU_SOURCE
.\"O is defined.
.\"O Since glibc 2.2.2 the requirements are as shown in the SYNOPSIS.
-°¤¤¤³¤È¤Ë glibc 2.0 °ÊÁ°¤Ç¤Ï
+悪いことに glibc 2.0 以前では
.BR pselect ()
-¤Î¥×¥í¥È¥¿¥¤¥×¤¬´Ö°ã¤Ã¤Æ¤¤¤ë¡£
-glibc 2.1 ¤«¤é 2.2.1 ¤Ç¤Ï
+のプロトタイプが間違っている。
+glibc 2.1 から 2.2.1 では
.B _GNU_SOURCE
-¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¡¢
+が定義されている場合に、
.BR pselect ()
-¤¬Ä󶡤µ¤ì¤ë¡£
-glibc 2.2.2 °Ê¹ß¤Ç¤Ï¡¢
+が提供される。
+glibc 2.2.2 以降では、
.BR pselect ()
-¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¡Ö½ñ¼°¡×¤ËµºÜ¤µ¤ì¤¿Í×·ï¤òËþ¤¿¤¹É¬Íפ¬¤¢¤ë¡£
+を使用するには、「書式」に記載された要件を満たす必要がある。
.\"O .SS "LINUX NOTES"
-.SS "Linux ¤Ç¤ÎÃí°Õ"
+.SS "Linux での注意"
.\"O The Linux
.\"O .BR pselect ()
.\"O system call modifies its
.\"O .I timeout
.\"O argument.
-Linux ¤Î
+Linux の
.BR pselect ()
-¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï
+システムコールは
.I timeout
-°ú¤¿ô¤òÊѹ¹¤¹¤ë¡£
+引き数を変更する。
.\"O However, the glibc wrapper function hides this behavior
.\"O by using a local variable for the timeout argument that
.\"O is passed to the system call.
.\"O .BR pselect ()
.\"O function does not modify its timeout argument;
.\"O this is the behavior required by POSIX.1-2001.
-¤·¤«¤·¡¢ glibc ¤Î¥é¥Ã¥Ñ¡¼´Ø¿ô¤Ï¡¢¥·¥¹¥Æ¥à¥³¡¼¥ë¤ËÅϤ¹ timeout °ú¤¿ô
-¤È¤·¤Æ¥í¡¼¥«¥ëÊÑ¿ô¤ò»È¤¦¤³¤È¤Ç¤³¤ÎÆ°ºî¤ò±£Ê䷤Ƥ¤¤ë¡£
-¤³¤Î¤¿¤á¡¢glibc ¤Î
+しかし、 glibc のラッパー関数は、システムコールに渡す timeout 引き数
+としてローカル変数を使うことでこの動作を隠蔽している。
+このため、glibc の
.BR pselect ()
-´Ø¿ô¤Ï timeout °ú¤¿ô¤òÊѹ¹¤·¤Ê¤¤¡£
-¤³¤ì¤¬ POSIX.1-2001 ¤¬Í׵ᤷ¤Æ¤¤¤ëÆ°ºî¤Ç¤¢¤ë¡£
+関数は timeout 引き数を変更しない。
+これが POSIX.1-2001 が要求している動作である。
.\"O .SH BUGS
-.SH ¥Ð¥°
+.SH ã\83\90ã\82°
.\"O Glibc 2.0 provided a version of
.\"O .BR pselect ()
.\"O that did not take a
.\"O .I sigmask
.\"O argument.
-glibc 2.0 ¤Ç¤Ï¡¢
+glibc 2.0 では、
.I sigmask
-°ú¤¿ô¤ò¼è¤é¤Ê¤¤¥Ð¡¼¥¸¥ç¥ó¤Î
+引き数を取らないバージョンの
.BR pselect ()
-¤¬Ä󶡤µ¤ì¤Æ¤¤¤¿¡£
+が提供されていた。
.\"O Starting with version 2.1, glibc provided an emulation of
.\"O .BR pselect ()
.\"O This implementation remained vulnerable to the very race condition that
.\"O .BR pselect ()
.\"O was designed to prevent.
-¥Ð¡¼¥¸¥ç¥ó 2.1 °Ê¹ß¤Î glibc ¤Ç¤Ï¡¢
+バージョン 2.1 以降の glibc では、
.BR pselect ()
-¤Ï
+は
.BR sigprocmask (2)
-¤È
+と
.BR select ()
-¤ò»È¤Ã¤Æ¥¨¥ß¥å¥ì¡¼¥È¤µ¤ì¤Æ¤¤¤¿¡£
-¤³¤Î¼ÂÁõ¤Ë¤Ï¤¤ï¤É¤¤¶¥¹ç¾ò·ï¤Ë¤ª¤¤¤ÆÀȼåÀ¤¬»Ä¤Ã¤Æ¤¤¤¿¡£
-¤³¤Î¶¥¹ç¾ò·ï¤Ë¤ª¤±¤ëÌäÂê¤òËɻߤ¹¤ë¤¿¤á¤Ë
+を使ってエミュレートされていた。
+この実装にはきわどい競合条件において脆弱性が残っていた。
+この競合条件における問題を防止するために
.BR pselect ()
-¤ÏÀ߷פµ¤ì¤¿¤Î¤Ç¤¢¤ë¡£
+は設計されたのである。
.\"O Modern versions of glibc use the (race-free)
.\"O .BR pselect ()
.\"O system call on kernels where it is provided.
-ºÇ¶á¤Î¥Ð¡¼¥¸¥ç¥ó¤Î glibc ¤Ç¤Ï¡¢¥«¡¼¥Í¥ë¤¬¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢
-(¶¥¹ç¤¬µ¯¤³¤é¤Ê¤¤)
+最近のバージョンの glibc では、カーネルがサポートしている場合には、
+(競合が起こらない)
.BR pselect ()
-¥·¥¹¥Æ¥à¥³¡¼¥ë¤¬»ÈÍѤµ¤ì¤ë¡£
+システムコールが使用される。
.\"O On systems that lack
.\"O .BR pselect (),
.\"O .BR select ()
.\"O in the main program.)
.BR pselect ()
-¤¬¤Ê¤¤¥·¥¹¥Æ¥à¤Ë¤ª¤¤¤Æ¡¢
-¥·¥°¥Ê¥ë¤ÎÊ᪤ò¿®ÍêÀ¤¬¤¢¤ê (°Ü¿¢À¤â¹â¤¤) ÊýË¡¤Ç¹Ô¤¦¤Ë¤Ï¡¢
-¼«¸Ê¥Ñ¥¤¥× (self-pipe) ¤È¤¤¤¦µ»¤ò»È¤¦¤È¤è¤¤ (¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ï¥Ñ¥¤¥×¤Ø
-1 ¥Ð¥¤¥È¤Î¥Ç¡¼¥¿¤ò½ñ¤¹þ¤ß¡¢Æ±¤¸¥Ñ¥¤¥×¤Î¤â¤¦°ìü¤ò¥á¥¤¥ó¥×¥í¥°¥é¥à¤Î
+がないシステムにおいて、
+シグナルの捕捉を信頼性があり (移植性も高い) 方法で行うには、
+自己パイプ (self-pipe) という技を使うとよい (シグナルハンドラはパイプへ
+1 バイトのデータを書き込み、同じパイプのもう一端をメインプログラムの
.BR select ()
-¤Ç´Æ»ë¤¹¤ë¤È¤¤¤¦ÊýË¡¤Ç¤¢¤ë)¡£
+で監視するという方法である)。
.\"O Under Linux,
.\"O .BR select ()
.\"O Thus it may be safer to use
.\"O .B O_NONBLOCK
.\"O on sockets that should not block.
-Linux ¤Ç¤Ï¡¢
+Linux では、
.BR select ()
-¤¬¥½¥±¥Ã¥È¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ç "Æɤ߹þ¤ß¤Î½àÈ÷¤¬¤Ç¤¤¿" ¤ÈÊó¹ð¤·¤¿¾ì¹ç¤Ç¤â¡¢
-¤³¤Î¸å¤Ç read ¤ò¹Ô¤¦¤ÈÄä»ß (block) ¤¹¤ë¤³¤È¤¬¤¢¤ë¡£¤³¤Î¤è¤¦¤Ê¾õ¶·¤Ï¡¢
-Î㤨¤Ð¡¢¥Ç¡¼¥¿¤¬ÅþÃ夷¤¿¤¬¡¢¸¡ºº¤Ç¥Á¥§¥Ã¥¯¥µ¥à°Û¾ï¤¬¸«¤Ä¤«¤êÇÑ´þ¤µ¤ì¤¿»þ
-¤Ê¤É¤Ëµ¯¤³¤ê¤¨¤ë¡£Â¾¤Ë¤â¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬½àÈ÷¤Ç¤¤¿¤È´Ö°ã¤Ã¤Æ
-Êó¹ð¤µ¤ì¤ë¾õ¶·¤¬µ¯¤³¤ë¤«¤â¤·¤ì¤Ê¤¤¡£
-.\" Stevens ¤¬µó¤²¤¿¤Î¤Ï¡¢select ¤¬À®¸ù¤·¤ÆÉüµ¢¤·¤Æ¤«¤é accept ¤¬
-.\" ¸Æ¤Ð¤ì¤ë¤Þ¤Ç¤Î´Ö¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤«¤é RST ¤¬Á÷¤é¤ì¤ë¤È¡¢
-.\" accept ¤¬Ää»ß¤¹¤ë¾ì¹ç¤Ç¤¢¤ë¡£
-¤·¤¿¤¬¤Ã¤Æ¡¢Ää»ß¤¹¤Ù¤¤Ç¤Ï¤Ê¤¤¥½¥±¥Ã¥È¤ËÂФ·¤Æ¤Ï
+がソケットファイルディスクリプタで "読み込みの準備ができた" と報告した場合でも、
+この後で read を行うと停止 (block) することがある。このような状況は、
+例えば、データが到着したが、検査でチェックサム異常が見つかり廃棄された時
+などに起こりえる。他にもファイルディスクリプタが準備できたと間違って
+報告される状況が起こるかもしれない。
+.\" Stevens が挙げたのは、select が成功して復帰してから accept が
+.\" 呼ばれるまでの間に、クライアントから RST が送られると、
+.\" accept が停止する場合である。
+したがって、停止すべきではないソケットに対しては
.B O_NONBLOCK
-¤ò»È¤¦¤È¤è¤ê°ÂÁ´¤Ç¤¢¤í¤¦¡£
+を使うとより安全であろう。
.\"O .\" Maybe the kernel should have returned EIO in such a situation?
-.\" ¿ʬ¡¢¤³¤Î¤è¤¦¤Ê¾õ¶·¤Ç¤Ï¥«¡¼¥Í¥ë¤Ï EIO ¤òÊÖ¤·¤Æ¤·¤Þ¤¦?
+.\" 多分、このような状況ではカーネルは EIO を返してしまう?
.\"O On Linux,
.\"O .BR select ()
.\"O but the glibc wrapper hides this behavior by internally copying the
.\"O .I timeout
.\"O to a local variable and passing that variable to the system call.
-Linux ¤Ç¤Ï¡¢
+Linux では、
.BR select ()
-¤¬¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ë¤è¤ê³ä¤ê¹þ¤Þ¤ì¤¿¾ì¹ç (¤Ä¤Þ¤ê
+がシグナルハンドラにより割り込まれた場合 (つまり
.B EINTR
-¥¨¥é¡¼¤¬ÊÖ¤ë¾ì¹ç)¡¢
+エラーが返る場合)、
.I timeout
-¤âÊѹ¹¤¹¤ë¡£
-¤³¤ì¤Ï POSIX.1-2001 ¤Ç¤Ïǧ¤á¤é¤ì¤Æ¤¤¤Ê¤¤µóÆ°¤Ç¤¢¤ë¡£
-Linux ¤Î
+も変更する。
+これは POSIX.1-2001 では認められていない挙動である。
+Linux の
.BR pselect ()
-¥·¥¹¥Æ¥à¥³¡¼¥ë¤âƱ¤¸µóÆ°¤ò¤¹¤ë¤¬¡¢
-glibc ¤Î¥é¥Ã¥Ñ¡¼´Ø¿ô¤¬¤³¤ÎµóÆ°¤ò±£Ê䷤Ƥ¤¤ë¡£
-¶ñÂÎŪ¤Ë¤Ï¡¢glibc ¤Î¥é¥Ã¥Ñ¡¼´Ø¿ô¤ÎÆâÉô¤Ç¡¢
+システムコールも同じ挙動をするが、
+glibc のラッパー関数がこの挙動を隠蔽している。
+具体的には、glibc のラッパー関数の内部で、
.I timeout
-¤ò¥í¡¼¥«¥ëÊÑ¿ô¤Ë¥³¥Ô¡¼¤·¡¢
-¤³¤Î¥í¡¼¥«¥ëÊÑ¿ô¤ò¥·¥¹¥Æ¥à¥³¡¼¥ë¤ËÅϤ·¤Æ¤¤¤ë¡£
+をローカル変数にコピーし、
+このローカル変数をシステムコールに渡している。
.\"O .SH EXAMPLE
-.SH Îã
+.SH 例
.nf
#include <stdio.h>
#include <stdlib.h>
struct timeval tv;
int retval;
- /* stdin (fd 0) ¤ò´Æ»ë¤·¡¢ÆþÎϤ¬¤¢¤Ã¤¿¾ì¹ç¤Ëɽ¼¨¤¹¤ë¡£*/
+ /* stdin (fd 0) を監視し、入力があった場合に表示する。*/
FD_ZERO(&rfds);
FD_SET(0, &rfds);
- /* 5 Éôִƻ뤹¤ë¡£*/
+ /* 5 秒間監視する。*/
tv.tv_sec = 5;
tv.tv_usec = 0;
retval = select(1, &rfds, NULL, NULL, &tv);
- /* ¤³¤Î»þÅÀ¤Ç¤Î tv ¤ÎÃͤò¿®Íꤷ¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£*/
+ /* この時点での tv の値を信頼してはならない。*/
if (retval == \-1)
perror("select()");
else if (retval)
- printf("º£¡¢¥Ç¡¼¥¿¤¬¼èÆÀ¤Ç¤¤Þ¤·¤¿¡£\\n");
- /* FD_ISSET(0, &rfds) ¤¬ true ¤Ë¤Ê¤ë¡£*/
+ printf("今、データが取得できました。\\n");
+ /* FD_ISSET(0, &rfds) が true になる。*/
else
- printf("5 ÉðÊÆâ¤Ë¥Ç¡¼¥¿¤¬ÆþÎϤµ¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£\\n");
+ printf("5 秒以内にデータが入力されませんでした。\\n");
exit(EXIT_SUCCESS);
}
.fi
.\"O .SH "SEE ALSO"
-.SH ´ØÏ¢¹àÌÜ
+.SH 関連項目
.\"O For a tutorial with discussion and examples, see
.\"O .BR select_tut (2).
-¹Í»¡¤È»ÈÍÑÎã¤Î½ñ¤«¤ì¤¿¥Á¥å¡¼¥È¥ê¥¢¥ë¤È¤·¤Æ¡¢
+考察と使用例の書かれたチュートリアルとして、
.BR select_tut (2)
-¤¬¤¢¤ë¡£
+がある。
.LP
.\"O For vaguely related stuff, see
-´Ø·¸¤¬¤¢¤ê¤½¤¦¤Ê¤â¤Î¤òµó¤²¤Æ¤ª¤¯:
+関係がありそうなものを挙げておく:
.BR accept (2),
.BR connect (2),
.BR poll (2),