-.\" Hey Emacs! This file is -*- nroff -*- source.
-.\"
.\" This manpage is copyright (C) 1992 Drew Eckhardt,
.\" copyright (C) 1995 Michael Shields.
.\"
+.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
+.\" %%%LICENSE_END
.\"
.\" Modified 1993-07-24 by Rik Faith <faith@cs.unc.edu>
.\" Modified 1995-05-18 by Jim Van Zandt <jrv@vanzandt.mv.com>
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
-.TH SELECT 2 2010\-08\-31 Linux "Linux Programmer's Manual"
+.\"
+.\" Japanese Version Copyright (c) 1997 HANATAKA Shinya all rights reserved.
+.\" Translated 1997-02-23, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
+.\" Modified 2000-03-12, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
+.\" Updated & Modified 2001-06-04, Yuichi SATO <ysato@h4.dion.ne.jp>
+.\" Updated & Modified 2001-07-01, Yuichi SATO
+.\" Updated & Modifedd 2002-01-14, Yuichi SATO
+.\" Updated 2002-09-24, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
+.\" Updated 2003-01-19, Akihiro MOTOKI
+.\" Updated 2005-03-17, Akihiro MOTOKI
+.\" Updated 2006-04-16, Akihiro MOTOKI, LDP v2.28
+.\" Updated 2006-07-23, Akihiro MOTOKI, LDP v2.36
+.\" Updated 2007-09-08, Akihiro MOTOKI, LDP v2.64
+.\" Updated 2008-08-06, Akihiro MOTOKI, LDP v3.05
+.\" Updated 2012-05-30, Akihiro MOTOKI <amotoki@gmail.com>
+.\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
+.\"
+.TH SELECT 2 2013\-09\-04 Linux "Linux Programmer's Manual"
.SH 名前
select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO \- 同期 I/O の多重化
.SH 書式
.PP
\fInfds\fP は 3 つの集合に含まれるファイルディスクリプタの最大値に 1 を足したものである。
.PP
-\fItimeout\fP は \fBselect\fP() が復帰するまでの経過時間の上限である。 \fItimeval\fP 構造体の両方のフィールドが 0
-の場合、 \fBselect\fP() はすぐに復帰する (この機能はポーリング (polling) を行うのに便利である)。 \fItimeout\fP に
-NULL (タイムアウトなし) が指定されると、 \fBselect\fP() は無期限に停止 (block) する。
+\fItimeout\fP 引き数で、ファイルディスクリプタが ready になるのを待って
+\fBselect\fP() が停止する停止時間を指定する
+(この停止時間はシステムクロックの粒度に切り上げられ、
+カーネルのスケジューリング遅延により少しだけ長くなる可能性がある)。
+\fItimeval\fP 構造体の両方のフィールドが 0 の場合、 \fBselect\fP() はすぐに復
+帰する (この機能はポーリング (polling) を行うのに便利である)。
+\fItimeout\fP に NULL (タイムアウトなし) が指定されると、 \fBselect\fP() は無
+期限に停止 (block) する。
.PP
\fIsigmask\fP は、シグナルマスク (\fBsigprocmask\fP(2) を参照) へのポインタである。 \fIsigmask\fP が NULL
でない場合、 \fBpselect\fP() は \fIsigmask\fP が指しているシグナルマスクで現在のシグナルマスクを置き換えてから、 "select"
sigset_t origmask;
- sigprocmask(SIG_SETMASK, &sigmask, &origmask);
+ pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);
ready = select(nfds, &readfds, &writefds, &exceptfds, timeout);
- sigprocmask(SIG_SETMASK, &origmask, NULL);
+ pthread_sigmask(SIG_SETMASK, &origmask, NULL);
.fi
.PP
\fBpselect\fP() が必要になる理由は、シグナルやファイルディスクリプタの状態変化を 待ちたいときには、競合状態を避けるために atomic
悪いことに glibc 2.0 以前では \fBpselect\fP() のプロトタイプが間違っている。 glibc 2.1 から 2.2.1 では
\fB_GNU_SOURCE\fP が定義されている場合に、 \fBpselect\fP() が提供される。 glibc 2.2.2 以降では、
\fBpselect\fP() を使用するには、「書式」に記載された要件を満たす必要がある。
+.SS マルチスレッド・アプリケーション
+\fBselect\fP() で監視中のファイルディスクリプタが別のスレッドでクローズされた場合、どのような結果になるかは規定されていない。いくつかの
+UNIX システムでは、 \fBselect\fP() は停止 (block) せず、すぐ返り、ファイルディスクリプタが ready だと報告される
+(\fBselect\fP() が返ってから I/O 操作が実行されるまでの間に、 別のファイルディスクリプタが再度オープンされない限り、 それ以降の I/O
+操作はおそらく失敗するだろう)。 Linux (や他のいくつかのシステム) では、 別のスレッドでファイルディスクリプタがクローズされても
+\fBselect\fP() には影響を与えない。
+まとめると、このような場合に特定の動作に依存しているアプリケーションは「バグっている」と考えなければならない。
.SS "Linux での注意"
-Linux の \fBpselect\fP() システムコールは \fItimeout\fP 引き数を変更する。 しかし、
-glibc のラッパー関数は、システムコールに渡す timeout 引き数 としてローカル変数
-を使うことでこの動作を隠蔽している。 このため、glibc の \fBpselect\fP() 関数は
-\fItimeout\fP 引き数を変更しない。 これが POSIX.1\-2001 が要求している動作である。
+このページで説明している \fBpselect\fP() のインターフェースは、glibc に
+実装されているものである。内部で呼び出される Linux のシステムコールは
+\fBpselect6\fP() という名前である。このシステムコールは glibc のラッパー
+関数とは少し違った動作をする。
+
+Linux の \fBpselect6\fP() システムコールは \fItimeout\fP 引き数を変更する。
+しかし、glibc のラッパー関数は、システムコールに渡す timeout 引き数と
+してローカル変数を使うことでこの動作を隠蔽している。このため、glibc の
+\fBpselect\fP() 関数は \fItimeout\fP 引き数を変更しない。
+これが POSIX.1\-2001 が要求している動作である。
+
+\fBpselect6\fP() システムコールの最後の引き数は \fIsigset_t\ *\fP 型の
+ポインタではなく、以下に示す構造体である。
+.in +4
+.nf
+
+struct {
+ const sigset_t *ss; /* シグナル集合へのポインタ */
+ size_t ss_len; /* 'ss' が指すオブジェクトのサイズ
+ (バイト数) */
+};
+
+.fi
+.in
+このようにすることで、ほとんどのアーキテクチャがサポートしている
+システムコールの引き数が最大で 6 個という事実を満たしつつ、
+\fBpselect6\fP() システムコールがシグナル集合へのポインタとシグナル集合
+のサイズの両方を取得することができるのである。
.SH バグ
glibc 2.0 では、 \fIsigmask\fP 引き数を取らないバージョンの \fBpselect\fP() が提供されていた。
\fBpselect\fP() は設計されたのである。 最近のバージョンの glibc では、カーネルがサポートしている場合には、 (競合が起こらない)
\fBpselect\fP() システムコールが使用される。
-\fBpselect\fP() がないシステムにおいて、 シグナルの捕捉を信頼性があり (移植性も高い) 方法で行うには、 自己パイプ
-(self\-pipe) という技を使うとよい (シグナルハンドラはパイプへ 1 バイトのデータを書き込み、同じパイプのもう一端をメインプログラムの
-\fBselect\fP() で監視するという方法である)。
+\fBpselect\fP() がないシステムにおいて、シグナルの捕捉を信頼性があり (移植
+性も高い) 方法で行うには、 自己パイプ (self\-pipe) という技を使うとよい。
+この方法では、シグナルハンドラはパイプへ 1 バイトのデータを書き込み、
+同じパイプのもう一端をメインプログラムの \fBselect\fP() で監視する (一杯に
+なったパイプへの書き込みや空のパイプから読み出しを行った際に起こるであ
+ろう停止 (blocking) を避けるためには、パイプへの読み書きの際には 非停止
+(nonblocking) I/O を使用するとよい)。
.\" Stevens discusses a case where accept can block after select
.\" returns successfully because of an intervening RST from the client.
}
.fi
.SH 関連項目
+\fBaccept\fP(2), \fBconnect\fP(2), \fBpoll\fP(2), \fBread\fP(2), \fBrecv\fP(2), \fBsend\fP(2),
+\fBsigprocmask\fP(2), \fBwrite\fP(2), \fBepoll\fP(7), \fBtime\fP(7)
+
考察と使用例の書かれたチュートリアルとして、 \fBselect_tut\fP(2) がある。
-.LP
-関係がありそうなものを挙げておく: \fBaccept\fP(2), \fBconnect\fP(2), \fBpoll\fP(2), \fBread\fP(2),
-\fBrecv\fP(2), \fBsend\fP(2), \fBsigprocmask\fP(2), \fBwrite\fP(2), \fBepoll\fP(7),
-\fBtime\fP(7)
.SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.54 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。