OSDN Git Service

(split) LDP v3.24 -> v3.29 の定型的な変更内容を反映。
[linuxjm/LDP_man-pages.git] / release / man2 / select_tut.2
1 .\" This manpage is copyright (C) 2001 Paul Sheer.
2 .\"
3 .\" Permission is granted to make and distribute verbatim copies of this
4 .\" manual provided the copyright notice and this permission notice are
5 .\" preserved on all copies.
6 .\"
7 .\" Permission is granted to copy and distribute modified versions of this
8 .\" manual under the conditions for verbatim copying, provided that the
9 .\" entire resulting derived work is distributed under the terms of a
10 .\" permission notice identical to this one.
11 .\"
12 .\" Since the Linux kernel and libraries are constantly changing, this
13 .\" manual page may be incorrect or out-of-date.  The author(s) assume no
14 .\" responsibility for errors or omissions, or for damages resulting from
15 .\" the use of the information contained herein.  The author(s) may not
16 .\" have taken the same level of care in the production of this manual,
17 .\" which is licensed free of charge, as they might when working
18 .\" professionally.
19 .\"
20 .\" Formatted or processed versions of this manual, if unaccompanied by
21 .\" the source, must acknowledge the copyright and authors of this work.
22 .\"
23 .\" very minor changes, aeb
24 .\"
25 .\" Modified 5 June 2002, Michael Kerrisk <mtk.manpages@gmail.com>
26 .\" 2006-05-13, mtk, removed much material that is redundant with select.2
27 .\"             various other changes
28 .\" 2008-01-26, mtk, substantial changes and rewrites
29 .\"
30 .\" Translated 2002-02-21, NAKANO Takeo <nakano@apm.seikei.ac.jp>
31 .\" Updated 2002-09-23, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
32 .\" Updated 2005-03-15, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
33 .\" Updated 2006-07-21, Akihiro MOTOKI, LDP v2.36
34 .\" Updated 2009-02-13, Akihiro MOTOKI, LDP v3.18
35 .\"
36 .\"WORD:        file descriptor         ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿
37 .\"WORD:        exceptional condition   Îã³°¾õÂÖ
38 .\"
39 .TH SELECT_TUT 2 2010-06-10 "Linux" "Linux Programmer's Manual"
40 .SH Ì¾Á°
41 select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO \- Æ±´ü I/O ¤Î¿½Å²½
42 .SH ½ñ¼°
43 .nf
44 /* POSIX.1-2001 ¤Ë½¾¤¦¾ì¹ç */
45 .br
46 .B #include <sys/select.h>
47 .sp
48 /* °ÊÁ°¤Îµ¬³Ê¤Ë½¾¤¦¾ì¹ç */
49 .br
50 .B #include <sys/time.h>
51 .br
52 .B #include <sys/types.h>
53 .br
54 .B #include <unistd.h>
55 .sp
56 .BI "int select(int " nfds ", fd_set *" readfds ", fd_set *" writefds ,
57 .BI "           fd_set *" exceptfds ", struct timeval *" utimeout );
58 .sp
59 .BI "void FD_CLR(int " fd ", fd_set *" set );
60 .br
61 .BI "int  FD_ISSET(int " fd ", fd_set *" set );
62 .br
63 .BI "void FD_SET(int " fd ", fd_set *" set );
64 .br
65 .BI "void FD_ZERO(fd_set *" set );
66 .sp
67 .B #include <sys/select.h>
68 .sp
69 .BI "int pselect(int " nfds ", fd_set *" readfds ", fd_set *" writefds ,
70 .BI "            fd_set *" exceptfds ", const struct timespec *" ntimeout ,
71 .BI "            const sigset_t *" sigmask );
72 .fi
73 .sp
74 .in -4n
75 glibc ¸þ¤±¤Îµ¡Ç½¸¡ºº¥Þ¥¯¥í¤ÎÍ×·ï
76 .RB ( feature_test_macros (7)
77 »²¾È):
78 .in
79 .sp
80 .BR pselect ():
81 _POSIX_C_SOURCE\ >=\ 200112L || _XOPEN_SOURCE\ >=\ 600
82 .SH ÀâÌÀ
83 .BR select ()
84 (¤ä
85 .BR pselect ())
86 ¤ò»È¤¦¤È¡¢¸úΨŪ¤ËÊ£¿ô¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò´Æ»ë¤·¡¢
87 ¤½¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¤¤¤º¤ì¤«¤¬
88 ¡Öready (½àÈ÷¤¬¤Ç¤­¤¿)¡×¾õÂÖ¡¢¤Ä¤Þ¤ê I/O (Æþ½ÐÎÏ) ¤¬²Äǽ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤«¤ä¡¢
89 ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¤¤¤º¤ì¤«¤¬
90 ¡ÖÎã³°¾õÂÖ (exceptional condition)¡×¤¬È¯À¸¤·¤¿¤«¡¢¤òÄ´¤Ù¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
91
92 ¤³¤Î´Ø¿ô¤Î¼çÍפʰú¤­¿ô¤Ï¡¢3¼ïÎà¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¡Ö½¸¹ç¡×
93 \fIreadfds\fP, \fIwritefds\fP, \fIexceptfds\fP ¤Ç¤¢¤ë¡£
94 ³Æ¡¹¤Î½¸¹ç¤Ï
95 .B fd_set
96 ¤È¤·¤ÆÀë¸À¤µ¤ì¡¢¤½¤ÎÆâÍƤÏ
97 .BR FD_CLR (),
98 .BR FD_ISSET (),
99 .BR FD_SET (),
100 .BR FD_ZERO ()
101 ¤È¤¤¤Ã¤¿¥Þ¥¯¥í¤Ë¤è¤Ã¤ÆÁàºî¤Ç¤­¤ë¡£
102 ¿·¤·¤¯Àë¸À¤µ¤ì¤¿½¸¹ç¤Ï¡¢¤Þ¤ººÇ½é¤Ë
103 .BR FD_ZERO ()
104 ¤ò»È¤Ã¤Æ¥¯¥ê¥¢¤¹¤Ù¤­¤Ç¤¢¤ë¡£
105 .BR select ()
106 ¤Ï¤³¤ì¤é¤Î½¸¹ç¤ÎÆâÍƤò¡¢°Ê¹ß¤Ë½Ò¤Ù¤ëµ¬Â§¤Ë½¾¤Ã¤Æ½¤Àµ¤¹¤ë¡£
107 .BR select ()
108 ¤ò¸Æ¤ó¤À¸å¡¢¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬¤Þ¤À½¸¹ç¤Ë¸ºß¤·¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¢
109 .BR FD_ISSET ()
110 ¥Þ¥¯¥í¤Ë¤è¤Ã¤ÆÄ´¤Ù¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
111 .BR FD_ISSET ()
112 ¤Ï»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬½¸¹ç¤Ë¸ºß¤·¤Æ¤¤¤ì¤Ð 0 °Ê³°¤ÎÃͤòÊÖ¤·¡¢
113 ¸ºß¤·¤Ê¤±¤ì¤Ð 0 ¤òÊÖ¤¹¡£
114 .BR FD_CLR ()
115 ¤Ï½¸¹ç¤«¤é¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Îºï½ü¤ò¹Ô¤¦¡£
116 .SS °ú¤­¿ô
117 .TP
118 \fIreadfds\fP
119 ¤³¤Î½¸¹ç¤Ë´Þ¤Þ¤ì¤ë¤¤¤º¤ì¤«¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ç¡¢
120 ¥Ç¡¼¥¿¤ÎÆɤ߹þ¤ß¤¬²Äǽ¤Ë¤Ê¤Ã¤¿¤«¤É¤¦¤«¤ò´Æ»ë¤¹¤ë¡£
121 .BR select ()
122 ¤«¤éÌá¤ë»þ¤Ë¡¢\fIreadfds\fP ¤Î¤¦¤Á¡¢
123 ľ¤Á¤ËÆɤ߹þ¤ß²Äǽ¤Ê¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿°Ê³°¤Ï
124 ½¸¹ç¤«¤éºï½ü¤µ¤ì¤ë¡£
125 .TP
126 \fIwritefds\fP
127 ¤³¤Î½¸¹ç¤Ë´Þ¤Þ¤ì¤ë¤¤¤º¤ì¤«¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ç¡¢
128 ¥Ç¡¼¥¿¤ò½ñ¤­¹þ¤à¥¹¥Ú¡¼¥¹¤¬¤¢¤ë¤«¤É¤¦¤«¤ò´Æ»ë¤¹¤ë¡£
129 .BR select ()
130 ¤«¤éÌá¤ë»þ¤Ë¡¢\fIwritefds\fP ¤Î¤¦¤Á¡¢
131 ľ¤Á¤Ë½ñ¤­¹þ¤ß²Äǽ¤Ê¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿°Ê³°¤Ï
132 ½¸¹ç¤«¤éºï½ü¤µ¤ì¤ë¡£
133 .TP
134 \fIexceptfds\fP
135 ¤³¤Î½¸¹ç¤Ë´Þ¤Þ¤ì¤ë¤¤¤º¤ì¤«¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ç¡¢
136 ¡ÖÎã³°¾õÂÖ (exceptional condition)¡×¤¬È¯À¸¤·¤¿¤«¤É¤¦¤«¤ò´Æ»ë¤¹¤ë¡£
137 ¼ÂºÝ¤ÎÆ°ºî¤Ç¤Ï¡¢ÉáÄ̤˵¯¤³¤êÆÀ¤ëÎã³°¾õÂ֤ϰì¤Ä¤À¤±¤Ç¤¢¤ê¡¢
138 ¤½¤ì¤Ï TCP ¥½¥±¥Ã¥È¤Ç \fIÂÓ°è³° (out-of-band; OOB)\fP ¥Ç¡¼¥¿¤¬
139 Æɤ߹þ¤ß²Äǽ¤Ê¾ì¹ç¤Ç¤¢¤ë¡£
140 OOB ¥Ç¡¼¥¿¤Î¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢
141 .BR recv (2),
142 .BR send (2),
143 .BR tcp (7)
144 ¤ò»²¾È¤Î¤³¤È¡£
145 (¤³¤ì°Ê³°¤Ç¤Ï¡¢¤Þ¤ì¤Ê¤³¤È¤À¤¬¡¢
146 ¥Ñ¥±¥Ã¥È¥â¡¼¥É¤Îµ¼»÷üËö (pseudoterminals) ¤Ç
147 .BR select ()
148 ¤¬Îã³°¾õÂÖ¤ò¼¨¤¹¤³¤È¤¬¤¢¤ë¡£)
149 .BR select ()
150 ¤¬ÊÖ¤ë»þ¤Ë¡¢\fIexceptfds\fP ¤Î¤¦¤Á¡¢
151 Îã³°¾õÂÖ¤¬È¯À¸¤·¤¿¥Ç¥£¥¹¥¯¥ê¥×¥¿°Ê³°¤Ï½¸¹ç¤«¤éºï½ü¤µ¤ì¤ë¡£
152 .TP
153 \fInfds\fP
154 Á´¤Æ¤Î½¸¹ç¤Ë´Þ¤Þ¤ì¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¤¦¤Á¡¢
155 Ãͤ¬ºÇÂç¤Î¤â¤Î¤Ë 1 ¤ò­¤·¤¿À°¿ô¤Ç¤¢¤ë¡£
156 ¤¹¤Ê¤ï¤Á¡¢¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò³Æ½¸¹ç¤Ë²Ã¤¨¤ëºî¶È¤ÎÅÓÃæ¤Ç¡¢
157 Á´¤Æ¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò¸«¤ÆºÇÂçÃͤòµá¤á¡¢
158 ¤½¤ì¤Ë 1 ¤ò²Ã¤¨¤Æ \fInfds\fP ¤È¤·¤ÆÅϤµ¤Ê¤¤¤È¤¤¤±¤Ê¤¤¡¢¤È¤¤¤¦¤³¤È¤À¡£
159 .TP
160 \fIutimeout\fP
161 (²¿¤âµ¯¤³¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë)
162 .BR select ()
163 ¤¬Ìá¤ëÁ°¤ËÂԤĺÇÂç»þ´Ö¤Ç¤¢¤ë¡£
164 ¤³¤ÎÃͤˠNULL ¤òÅϤ¹¤È¡¢
165 .BR select ()
166 ¤Ï¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¤¤¤º¤ì¤«¤¬ ready (½àÈ÷¤¬¤Ç¤­¤¿) ¾õÂÖ¤Ë
167 ¤Ê¤ë¤Þ¤ÇÂÔ¤Á³¤±¤Æ¤º¤Ã¤ÈÄä»ß¤¹¤ë¡£
168 \fIutimeout\fP ¤Ï 0 Éäˤ¹¤ë¤³¤È¤â¤Ç¤­¡¢
169 ¤³¤Î¾ì¹ç
170 .BR select ()
171 ¤Ïľ¤Á¤ËÊ֤ꡢ¸Æ¤Ó½Ð¤·»þÅÀ¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Î¾õÂÖ¤Ë
172 ´Ø¤¹¤ë¾ðÊó¤¬ÊÖ¤µ¤ì¤ë¡£
173 ¹½Â¤ÂΠ\fIstruct timeval\fP ¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë:
174 .IP
175 .in +4n
176 .nf
177 struct timeval {
178     time_t tv_sec;    /* seconds */
179     long tv_usec;     /* microseconds */
180 };
181 .fi
182 .in
183 .TP
184 \fIntimeout\fP
185 .BR pselect ()
186 ¤Î¤³¤Î°ú¤­¿ô¤Ï
187 .I utimeout
188 ¤ÈƱ¤¸°ÕÌ£¤ò»ý¤Ä¤¬¡¢
189 .I "struct timespec"
190 ¤Ï¼¡¤Ë¼¨¤¹¤è¤¦¤Ë¥Ê¥ÎÉäÎÀºÅÙ¤ò»ý¤Ä¡£
191 .in +4n
192 .nf
193 struct timespec {
194     long tv_sec;    /* seconds */
195     long tv_nsec;   /* nanoseconds */
196 };
197 .fi
198 .in
199 .TP
200 \fIsigmask\fP
201 ¤³¤Î°ú¤­¿ô¤Ï¡¢¸Æ¤Ó½Ð¤·Â¦¤¬
202 .BR pselect ()
203 ÆâÉô¤ÇÄä»ß¤·¤Æ¤¤¤ë´Ö¤Ë¡¢¥«¡¼¥Í¥ë¤¬ÄÌÃΤòµö²Ä¤¹¤Ù¤­¥·¥°¥Ê¥ë½¸¹ç
204 (¤¹¤Ê¤ï¤Á¡¢¸Æ¤Ó½Ð¤·¤¿¥¹¥ì¥Ã¥É¤Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤«¤éºï½ü¤¹¤Ù¤­¥·¥°¥Ê¥ë½¸¹ç)
205 ¤òÊÝ»ý¤¹¤ë
206 .RB ( sigaddset (3)
207 ¤È
208 .BR sigprocmask (2)
209 ¤ò»²¾È)¡£
210 ¤³¤Î°ú¤­¿ô¤Ï NULL ¤Ë¤¹¤ë¤³¤È¤â¤Ç¤­¡¢¤½¤Î¾ì¹ç¤Ï¤³¤Î´Ø¿ô¤Ø
211 Æþ¤ë¤È¤­¡¦½Ð¤ë¤È¤­¤Ë¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤òÊѹ¹¤·¤Ê¤¤¡£
212 ¤³¤Î¾ì¹ç¡¢
213 .BR pselect ()
214 ¤Ï
215 .BR select ()
216 ¤ÈÁ´¤¯Æ±¤¸Æ°ºî¤È¤Ê¤ë¡£
217 .SS ¥·¥°¥Ê¥ë¤È¥Ç¡¼¥¿¥¤¥Ù¥ó¥È¤òÁȤ߹ç¤ï¤»¤ë
218 ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬ I/O ²Äǽ¤Ê¾õÂ֤ˤʤë¤Î¤ÈƱ»þ¤Ë
219 ¥·¥°¥Ê¥ë¤âÂÔ¤Á¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢
220 .BR pselect ()
221 ¤¬ÊØÍø¤Ç¤¢¤ë¡£
222 ¥·¥°¥Ê¥ë¤ò¼õ¿®¤¹¤ë¥×¥í¥°¥é¥à¤Ï¡¢Ä̾ï¤Ï¡¢
223 ¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤ò¥°¥í¡¼¥Ð¥ë¤Ê¥Õ¥é¥°¤òΩ¤Æ¤ë¤¿¤á¤À¤±¤Ë»È¤¦¡£
224 ¤³¤Î¥°¥í¡¼¥Ð¥ë¤Ê¥Õ¥é¥°¤Ï¡¢
225 ¤½¤Î¥¤¥Ù¥ó¥È¤ò¥×¥í¥°¥é¥à¤Î¥á¥¤¥ó¥ë¡¼¥×¤Ç
226 ½èÍý¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤ò¼¨¤¹¡£
227 ¥·¥°¥Ê¥ë¤ò¼õ¤±¤ë¤È
228 .BR select ()
229 (¤ä
230 .BR pselect ())
231 ¤Ï
232 \fIerrno\fP ¤Ë \fBEINTR\fP ¤ò¥»¥Ã¥È¤·¤ÆÌá¤ë¤³¤È¤Ë¤Ê¤ë¡£
233 ¥·¥°¥Ê¥ë¤¬¥×¥í¥°¥é¥à¤Î¥á¥¤¥ó¥ë¡¼¥×¤Ç½èÍý¤µ¤ì¤ë¤¿¤á¤Ë¤Ï¤³¤ÎÆ°ºî¤¬ÉԲķç¤Ç¡¢
234 ¤³¤ì¤¬¤Ê¤¤¤È
235 .BR select ()
236 ¤Ï±Ê±ó¤ËÄä»ß¤·Â³¤±¤ë¤³¤È¤Ë¤Ê¤ë¡£
237 ¤µ¤Æ¡¢¥á¥¤¥ó¥ë¡¼¥×¤Î¤É¤³¤«¤Ë¤³¤Î¥°¥í¡¼¥Ð¥ë¥Õ¥é¥°¤ò¥Á¥§¥Ã¥¯¤¹¤ë
238 ¾ò·ïʸ¤¬¤¢¤ë¤È¤·¤è¤¦¡£¤³¤³¤Ç¾¯¤·¹Í¤¨¤Æ¤ß¤Ê¤¤¤È¤¤¤±¤Ê¤¤¡£
239 ¡Ö¥·¥°¥Ê¥ë¤¬¾ò·ïʸ¤Î¸å¡¢¤·¤«¤·
240 .BR select ()
241 ¥³¡¼¥ë¤ÎÁ°¤ËÅþÃ夷¤¿¤é
242 ¤É¤¦¤Ê¤ë¤Î¤«¡©¡×
243 Åú¤¨¤Ï¡Ö¤½¤Î
244 .BR select ()
245 ¤Ï¡¢¤¿¤È¤¨²ò·èÂÔ¤Á¤Î¥¤¥Ù¥ó¥È¤¬¤¢¤Ã¤¿¤È¤·¤Æ¤â¡¢
246 ±Ê±ó¤ËÄä»ß¤¹¤ë¡×¤Ç¤¢¤ë¡£
247 ¤³¤Î¶¥¹ç¾õÂÖ¤Ï
248 .BR pselect ()
249 ¥³¡¼¥ë¤Ë¤è¤Ã¤Æ²ò·è¤Ç¤­¤ë¡£
250 ¤³¤Î¥³¡¼¥ë¤ò»È¤¦¤È¡¢
251 .BR pselect ()
252 ¤Ç¼õ¿®¤·¤¿¤¤¥·¥°¥Ê¥ë¤Î½¸¹ç¤À¤±¤ò¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤ËÀßÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
253 Î㤨¤Ð¡¢ÌäÂê¤È¤Ê¤Ã¤Æ¤¤¤ë¥¤¥Ù¥ó¥È¤¬»Ò¥×¥í¥»¥¹¤Î½ªÎ»¤Î¾ì¹ç¤ò¹Í¤¨¤è¤¦¡£
254 ¥á¥¤¥ó¥ë¡¼¥×¤¬»Ï¤Þ¤ëÁ°¤Ë¡¢
255 .B SIGCHLD
256 ¤ò
257 .BR sigprocmask (2)
258 ¤Ç¥Ö¥í¥Ã¥¯¤¹¤ë¡£
259 .BR pselect ()
260 ¥³¡¼¥ë¤Ç¤Ï
261 .B SIGCHLD
262 ¤ò¡¢¤â¤È¤â¤È¤Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯¤ò»È¤Ã¤ÆÍ­¸ú¤Ë¤¹¤ë¤Î¤À¡£
263 ¤³¤Î¥×¥í¥°¥é¥à¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡£
264 .PP
265 .nf
266 static volatile sig_atomic_t got_SIGCHLD = 0;
267
268 static void
269 child_sig_handler(int sig)
270 {
271     got_SIGCHLD = 1;
272 }
273
274 int
275 main(int argc, char *argv[])
276 {
277     sigset_t sigmask, empty_mask;
278     struct sigaction sa;
279     fd_set readfds, writefds, exceptfds;
280     int r;
281
282     sigemptyset(&sigmask);
283     sigaddset(&sigmask, SIGCHLD);
284     if (sigprocmask(SIG_BLOCK, &sigmask, NULL) == \-1) {
285         perror("sigprocmask");
286         exit(EXIT_FAILURE);
287     }
288
289     sa.sa_flags = 0;
290     sa.sa_handler = child_sig_handler;
291     sigemptyset(&sa.sa_mask);
292     if (sigaction(SIGCHLD, &sa, NULL) == \-1) {
293         perror("sigaction");
294         exit(EXIT_FAILURE);
295     }
296
297     sigemptyset(&empty_mask);
298
299     for (;;) {          /* main loop */
300         /* Initialize readfds, writefds, and exceptfds
301            before the pselect() call. (Code omitted.) */
302
303         r = pselect(nfds, &readfds, &writefds, &exceptfds,
304                     NULL, &empty_mask);
305         if (r == \-1 && errno != EINTR) {
306             /* Handle error */
307         }
308
309         if (got_SIGCHLD) {
310             got_SIGCHLD = 0;
311
312             /* Handle signalled event here; e.g., wait() for all
313                terminated children. (Code omitted.) */
314         }
315
316         /* main body of program */
317     }
318 }
319 .fi
320 .SS ¼ÂÎã
321 ¼ÂºÝ¤Î¤È¤³¤í
322 .BR select ()
323 ¤ÎÂç»ö¤ÊÅÀ¤Ï²¿¤Ê¤Î¤«¡©
324 ¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ï¹¥¤­¤Ê¤È¤­¤ËÆɤ߽ñ¤­¤Ç¤­¤ë¤ó¤¸¤ã¤Ê¤¤¤Î¡©
325 .BR select ()
326 ¤Î½ÅÍפʤȤ³¤í¤Ï¡¢Ê£¿ô¤Î¥Ç¥£¥¹¥¯¥ê¥×¥¿¤òƱ»þ¤Ë´Æ»ë¤Ç¤­¡¢
327 ¤Ê¤ó¤ÎÆ°¤­¤â¤Ê¤±¤ì¤Ð¥×¥í¥»¥¹¤òŬÀڤ˥¹¥ê¡¼¥×¾õÂ֤˰ܹԤ¹¤ë¤È¤³¤í¤Ë¤¢¤ë¤Î¤À¡£
328 UNIX ¥×¥í¥°¥é¥Þ¤Ï¡¢
329 Ê£¿ô¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ÎÆþ½ÐÎϤòƱ»þ¤Ë°·¤ï¤Í¤Ð¤Ê¤é¤º¡¢
330 ¤·¤«¤â¥Ç¡¼¥¿¤Îή¤ì¤Ï´Ö·çŪ¤Ç¤¢¤ë¡¢¤È¤¤¤¦¾õ¶·¤Ë¤è¤¯½Ð²ñ¤¦¡£
331 ñ¤Ë
332 .BR read (2)
333 ¤ä
334 .BR write (2)
335 ¥³¡¼¥ë¤Î¥·¡¼¥±¥ó¥¹¤òºî¤ë¤À¤±¤Ç¤Ï¡¢¤½¤ì¤é¤Î¥³¡¼¥ë¤Î¤É¤ì¤«¤¬
336 ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤«¤é¤Î¥Ç¡¼¥¿¤òÂԤäƥ֥í¥Ã¥¯¤·¤Æ¤ª¤ê¡¢
337 Ê̤Υե¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ë¤Ï I/O ¤¬²Äǽ¤Ê¤Î¤Ë»È¤¨¤Ê¤¤¡¢
338 ¤È¤¤¤¦¤³¤È¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¤À¤í¤¦¡£
339 .BR select ()
340 ¤ò»È¤¦¤È¤³¤Î¾õ¶·¤Ë¸ú²ÌŪ¤ËÂнè¤Ç¤­¤ë¡£
341 .SS SELECT ¤ÎÙÝ
342 .BR select ()
343 ¤ò»È¤ª¤¦¤È¤·¤¿Â¿¤¯¤Î¿Í¤Ï¡¢Íý²ò¤·¤Ë¤¯¤¤µóÆ°¤Ë½Ð¤¯¤ï¤·¡¢·ë²ÌŪ¤Ë
344 ¤Ç¤­¤¿¤â¤Î¤Ï°Ü¿¢À­¤¬¤Ê¤¤¤«¡¢¤è¤¯¤Æ¤â¥®¥ê¥®¥ê¤Î¤â¤Î¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡£
345 Î㤨¤Ð¡¢¾åµ­¤Î¥×¥í¥°¥é¥à¤Ï¡¢
346 ½¸¹ç¤Ë´Þ¤Þ¤ì¤ë¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤òÈóÄä»ß (nonblocking) ¥â¡¼¥É
347 ¤Ë¤·¤Ê¤¯¤Æ¤â¡¢¤É¤³¤Ë¤â¥Ö¥í¥Ã¥¯¤¬À¸¤¸¤Ê¤¤¤è¤¦Ãí°Õ¤·¤Æ½ñ¤«¤ì¤Æ¤¤¤ë¡£
348 Èù̯¤Ê´Ö°ã¤¤¤Ë¤è¤Ã¤Æ¡¢
349 .BR select ()
350 ¤ò»È¤¦ÍøÅÀ¤Ï´Êñ¤Ë¼º¤ï¤ì¤Æ¤·¤Þ¤¦¡£
351 ¤½¤³¤Ç¡¢
352 .BR select ()
353 ¥³¡¼¥ë¤ò»È¤¦¤È¤­¤ËÃí°Õ¤¹¤Ù¤­½ÅÍ×»ö¹à¤òÎóµó¤·¤Æ¤ª¤¯¤³¤È¤Ë¤¹¤ë¡£
354 .TP 4
355 1.
356 .BR select ()
357 ¤ò»È¤¦¤È¤­¤Ï¡¢¥¿¥¤¥à¥¢¥¦¥È¤ÏÀßÄꤹ¤Ù¤­¤Ç¤Ê¤¤¡£
358 ½èÍý¤¹¤ë¥Ç¡¼¥¿¤¬Ìµ¤¤¤È¤­¤Ë¤Ï¡¢
359 ¤¢¤Ê¤¿¤Î¥×¥í¥°¥é¥à¤Ë¤Ï²¿¤â¤¹¤ë¤³¤È¤Ï̵¤¤¤Ï¤º¤Ç¤¢¤ë¡£
360 ¥¿¥¤¥à¥¢¥¦¥È¤Ë°Í¸¤·¤¿¥³¡¼¥É¤ÏÄ̾ï°Ü¿¢À­¤¬¤Ê¤¯¡¢
361 ¥Ç¥Ð¥Ã¥°¤âÆñ¤·¤¯¤Ê¤ë¡£
362 .TP
363 2.
364 ¾å½Ò¤·¤¿¤è¤¦¤Ë¡¢
365 ¸úΨŪ¤Ê¥×¥í¥°¥é¥à¤ò½ñ¤¯¤Ë¤Ï
366 .I nfds
367 ¤ÎÃͤòŬÀڤ˷׻»¤·¤ÆÍ¿¤¨¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
368 .TP
369 3.
370 .BR select ()
371 ¥³¡¼¥ë¤Î½ªÎ»¸å¤Ë·ë²Ì¤ò¥Á¥§¥Ã¥¯¤·¤Æ¡¢
372 ŬÀÚ¤ËÂбþ¤¹¤ë¤Ä¤â¤ê¤Î¤Ê¤¤¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ï¡¢
373 ¤É¤Î½¸¹ç¤Ë¤â²Ã¤¨¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
374 ¼¡¤Î¥ë¡¼¥ë¤â»²¾È¡£
375 .TP
376 4.
377 .BR select ()
378 ¤«¤éÊ֤俸å¤Ë¤Ï¡¢Á´¤Æ¤Î½¸¹ç¤ÎÁ´¤Æ¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤Ë¤Ä¤¤¤Æ
379 Æɤ߽ñ¤­²Äǽ¤Ê¾õÂ֤ˤʤäƤ¤¤ë¤«¤ò¥Á¥§¥Ã¥¯¤¹¤Ù¤­¤Ç¤¢¤ë¡£
380 .TP
381 5.
382 .BR read (2),
383 .BR recv (2),
384 .BR write (2),
385 .BR send (2)
386 ¤È¤¤¤Ã¤¿´Ø¿ô¤Ï¡¢¤³¤Á¤é¤¬Í׵ᤷ¤¿Á´¥Ç¡¼¥¿¤òÆɤ߽ñ¤­¤¹¤ëɬÍפÏ\fI¤Ê¤¤\fP¡£
387 ¤â¤·Á´¥Ç¡¼¥¿¤òÆɤ߽ñ¤­¤¹¤ë¤Ê¤é¡¢¤½¤ì¤Ï¥È¥é¥Õ¥£¥Ã¥¯¤ÎÉé²Ù¤¬¾®¤µ¤¯¡¢
388 ¥¹¥È¥ê¡¼¥à¤¬Â®¤¤¾ì¹ç¤À¤í¤¦¡£¤³¤Î¾ò·ï¤Ï¾ï¤ËËþ¤¿¤µ¤ì¤ë¤È¤Ï¸Â¤é¤Ê¤¤¡£
389 ¤³¤ì¤é¤Î´Ø¿ô¤¬´èÄ¥¤Ã¤Æ¤â 1 ¥Ð¥¤¥È¤·¤«Á÷¼õ¿®¤Ç¤­¤Ê¤¤¤è¤¦¤Ê¾ì¹ç¤â
390 ¹Íθ¤ËÆþ¤ì¤Æ¤ä¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
391 .TP
392 6.
393 ½èÍý¤¹¤ë¥Ç¡¼¥¿Î̤¬¾®¤µ¤¤¤³¤È¤¬¤Ï¤Ã¤­¤ê¤È¤ï¤«¤Ã¤Æ¤¤¤ë¾ì¹ç¤ò½ü¤¤¤Æ¡¢
394 °ìÅ٤ˠ1 ¥Ð¥¤¥È¤º¤ÄÆɤ߽ñ¤­¤¹¤ë¤è¤¦¤Ê¤³¤È¤Ï¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
395 ¥Ð¥Ã¥Õ¥¡¤Îµö¤¹¤«¤®¤ê¤Î¥Ç¡¼¥¿¤ò¤Þ¤È¤á¤ÆÆɤ߽ñ¤­¤·¤Ê¤¤¤È¡¢
396 Èó¾ï¤Ë¸úΨ¤¬°­¤¤¡£²¼µ­¤ÎÎã¤Ç¤Ï¥Ð¥Ã¥Õ¥¡¤Ï 1024 ¥Ð¥¤¥È¤Ë¤·¤Æ¤¤¤ë¤¬¡¢
397 ¤³¤Î¥µ¥¤¥º¤òÂ礭¤¯¤¹¤ë¤Î¤Ï´Êñ¤À¤í¤¦¡£
398 .TP
399 7.
400 .BR read (2),
401 .BR recv (2),
402 .BR write (2),
403 .BR send (2)
404 ¤Ê¤É¤Î´Ø¿ô¤ä
405 .BR select ()
406 ¥³¡¼¥ë¤Ï¡¢
407 .I errno
408 ¤ò
409 .B EINTR " ¤ä " EAGAIN
410 .RB ( EWOULDBLOCK )
411 ¤Ë¤·¤Æ \-1 ¤òÊÖ¤¹¤³¤È¤¬¤¢¤ë¡£
412 ¤³¤Î¤è¤¦¤Ê·ë²Ì¤ËÂФ·¤ÆŬÀÚ¤ËÂбþ¤·¤Æ¤ä¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤
413 (¾åµ­¤ÎÎã¤Ç¤Ï¤·¤Æ¤¤¤Ê¤¤)¡£
414 ½ñ¤¤¤Æ¤¤¤ë¥×¥í¥°¥é¥à¤¬¥·¥°¥Ê¥ë¤ò¼õ¤±¤ëͽÄ꤬¤Ê¤±¤ì¤Ð¡¢
415 .B EINTR
416 ¤¬ÊÖ¤µ¤ì¤ë¤³¤È¤Ï¤¢¤Þ¤ê¹Í¤¨¤é¤ì¤Ê¤¤¡£
417 ½ñ¤¤¤Æ¤¤¤ë¥×¥í¥°¥é¥à¤ÇÈó¥Ö¥í¥Ã¥¯ I/O ¤ò¥»¥Ã¥È¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢
418 .B EAGAIN
419 ¤¬ÊÖ¤µ¤ì¤ë¤³¤È¤Ï¤Ê¤¤¤À¤í¤¦¡£
420 .\" ¤½¤ì¤Ç¤â¤Ê¤ª¡¢´°Á´¤ò´ü¤¹¤ë¤Ê¤é¤Ð¡¢
421 .\" ¤³¤ì¤é¤Î¥¨¥é¡¼¤ò¹Íθ¤ËÆþ¤ì¤ëɬÍפ¬¤¢¤ë¡£
422 .TP
423 8.
424 ·è¤·¤Æ¡¢°ú¤­¿ô¤ËŤµ 0 ¤Î¥Ð¥Ã¥Õ¥¡¤ò»ØÄꤷ¤Æ
425 .BR read (2),
426 .BR recv (2),
427 .BR write (2),
428 .BR send (2)
429 ¤ò¸Æ¤Ó½Ð¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
430 .TP
431 9.
432 .BR read (2),
433 .BR recv (2),
434 .BR write (2),
435 .BR send (2)
436 ¤¬
437 \fB7.\fP ¤Ë¼¨¤·¤¿°Ê³°¤Î¥¨¥é¡¼¤Ç¼ºÇÔ¤·¤¿¾ì¹ç¤ä¡¢
438 ÆþÎϷϤδؿô¤Î°ì¤Ä¤¬¥Õ¥¡¥¤¥ëËöÈø¤òɽ¤¹ 0 ¤òÊÖ¤·¤¿¾ì¹ç¤Ï¡¢
439 ¤½¤Î¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò¤â¤¦°ìÅÙ select ¤ËÅϤ·¤Æ¤Ï\fI¤Ê¤é¤Ê¤¤\fP¡£
440 ²¼µ­¤ÎÎã¤Ç¤Ï¡¢¤½¤Î¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò¤¿¤À¤Á¤Ë¥¯¥í¡¼¥º¤·¡¢
441 ¤½¤³¤Ë¤Ï \-1 ¤ò¥»¥Ã¥È¤·¤Æ¡¢
442 ¤½¤ì¤¬½¸¹ç¤Ë´Þ¤Þ¤ì³¤±¤ë¤Î¤òµö¤µ¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¤¤ë¡£
443 .TP
444 10.
445 ¥¿¥¤¥à¥¢¥¦¥È¤ÎÃͤÏ
446 .BR select ()
447 ¤ò¸Æ¤Ö¤¿¤Ó¤Ë½é´ü²½¤¹¤Ù¤­¤Ç¤¢¤ë¡£
448 OS ¤Ë¤è¤Ã¤Æ¤Ï timeout ¹½Â¤ÂΤ¬Êѹ¹¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ë¤«¤é¤Ç¤¢¤ë¡£
449 ⤷¡¢
450 .BR pselect ()
451 ¤Ï¼«Ê¬¤Î timeout ¹½Â¤ÂΤòÊѹ¹¤¹¤ë¤³¤È¤Ï¤Ê¤¤¡£
452 .TP
453 11.
454 .BR select ()
455 ¤Ï¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤òÊѹ¹¤¹¤ë¤Î¤Ç¡¢
456 .BR select ()
457 ¤¬¥ë¡¼¥×¤ÎÃæ¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢¸Æ¤Ó½Ð¤·¤ò¹Ô¤¦Á°¤ËËè²ó
458 ¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤ò½é´ü²½¤·Ä¾¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
459 .\" "I have heard" does not fill me with confidence, and doesn't
460 .\" belong in a man page, so I've commented this point out.
461 .\" .TP
462 .\" Ê¹¤¤¤¿¤È¤³¤í¤Ç¤Ï¡¢Windows ¤Î¥½¥±¥Ã¥ÈÁؤÏ
463 .\" OOB ¥Ç¡¼¥¿¤òÀµ¤·¤¯½èÍý¤·¤Ê¤¤¤é¤·¤¤¡£
464 .\" ¤Þ¤¿¡¢¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬Á´¤¯¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¤è¤¦¤Ê
465 .\" .BR select ()
466 .\" ¥³¡¼¥ë¤âÀµ¤·¤¯½èÍý¤·¤Ê¤¤¤é¤·¤¤¡£
467 .\" ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò°ìÀÚÀßÄꤷ¤Ê¤¤¤Ç timeout ¤ò»È¤¦¤ä¤êÊý¤Ï¡¢
468 .\" 1 Éðʲ¼¤ÎÀºÅÙ¤Ç¥×¥í¥»¥¹¤ò¥¹¥ê¡¼¥×¤µ¤»¤ë¤Ë¤ÏÊØÍø¤ÊÊýË¡¤Ê¤Î¤À¤¬
469 .\" (³¤­¤ò¸«¤è)¡£
470 .SS usleep ¥¨¥ß¥å¥ì¡¼¥·¥ç¥ó
471 .BR usleep (3)
472 ´Ø¿ô¤ò»ý¤¿¤Ê¤¤¥·¥¹¥Æ¥à¤Ç¤Ï¡¢
473 Í­¸Â¤Î¥¿¥¤¥à¥¢¥¦¥È¤ò»ØÄꤷ¡¢¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤òÁ´¤¯¥»¥Ã¥È¤»¤º¤Ë
474 .BR select ()
475 ¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ç¡¢¤³¤ì¤òÂåÍѤǤ­¤ë¡£
476 °Ê²¼¤Î¤è¤¦¤Ë¤¹¤ë¡£
477 .PP
478 .nf
479     struct timeval tv;
480     tv.tv_sec = 0;
481     tv.tv_usec = 200000;  /* 0.2 seconds */
482     select(0, NULL, NULL, NULL, &tv);
483 .fi
484 .PP
485 ⤷¡¢¤³¤ì¤¬Æ°¤¯¤ÈÊݾڤµ¤ì¤Æ¤¤¤ë¤Î¤Ï UNIX ¥·¥¹¥Æ¥à¤Ë¸Â¤é¤ì¤ë¡£
486 .SH ÊÖ¤êÃÍ
487 À®¸ù¤¹¤ë¤È¡¢
488 .BR select ()
489 ¤Ï¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤Ë»Ä¤Ã¤Æ¤¤¤ë
490 ¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ÎÁí¿ô¤òÊÖ¤¹¡£
491
492 .BR select ()
493 ¤¬¥¿¥¤¥à¥¢¥¦¥È¤¹¤ë¤È¡¢ÊÖ¤êÃͤϠ0 ¤Ë¤Ê¤ë¡£
494 ¤½¤Î»þ¡¢¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤Ï¤¹¤Ù¤Æ¶õ¤Ç¤¢¤ë
495 (¤·¤«¤·¤½¤¦¤Ê¤é¤Ê¤¤¥·¥¹¥Æ¥à¤â¤¢¤ë)¡£
496
497 ÊÖ¤êÃͤ¬ \-1 ¤Î¾ì¹ç¤Ï¥¨¥é¡¼¤ò°ÕÌ£¤·¡¢
498 .I errno
499 ¤¬Å¬Àڤ˥»¥Ã¥È¤µ¤ì¤ë¡£¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿¾ì¹ç¡¢
500 ÊÖ¤µ¤ì¤¿½¸¹ç¤ÎÆâÍƤ乽¤ÂΠ\fIstruct timeout\fP ¤ÎÆâÍƤÏ
501 ̤ÄêµÁ¤È¤Ê¤Ã¤Æ¤ª¤ê¡¢»ÈÍѤ¹¤Ù¤­¤Ç¤Ï¤Ê¤¤¡£
502 ¤·¤«¤·
503 .BR pselect ()
504 ¤Ï·è¤·¤Æ
505 .I ntimeout
506 ¤òÊѹ¹¤·¤Ê¤¤¡£
507 .SH Ãí°Õ
508 °ìÈÌŪ¤Ë¸À¤Ã¤Æ¡¢¥½¥±¥Ã¥È¤ò¥µ¥Ý¡¼¥È¤¹¤ëÁ´¤Æ¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹¥Æ¥à¤Ï
509 .BR select ()
510 ¤â¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£
511 .BR select ()
512 ¤ò»È¤¦¤È¡¢¥×¥í¥°¥é¥Þ¤¬¥¹¥ì¥Ã¥É¡¢¥Õ¥©¡¼¥¯¡¢IPC¡¢¥·¥°¥Ê¥ë¡¢¥á¥â¥ê¶¦Í­¡¢
513 Åù¡¹¤ò»È¤Ã¤Æ¤â¤Ã¤ÈÊ£»¨¤ÊÊýË¡¤Ç²ò·è¤·¤è¤¦¤È¤¹¤ë¿¤¯¤ÎÌäÂ꤬¡¢
514 °Ü¿¢À­¤¬¤¢¤ê¤«¤Ä¸úΨŪ¤ÊÊýË¡¤Ç²ò·è¤Ç¤­¤ë¡£
515 .PP
516 .BR poll (2)
517 ¥·¥¹¥Æ¥à¥³¡¼¥ë¤Ï
518 .BR select ()
519 ¤ÈƱ¤¸µ¡Ç½¤ò»ý¤Ã¤Æ¤ª¤ê¡¢
520 ¤Þ¤Ð¤é¤Ê¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿½¸¹ç¤ò´Æ»ë¤¹¤ë¾ì¹ç¤Ë
521 ¤¤¤¯¤é¤«¸úΨ¤¬¤è¤¤¡£
522 ¸½ºß¤Ç¤Ï¹­¤¯ÍøÍѲÄǽ¤Ç¤¢¤ë¤¬¡¢°ÊÁ°¤Ï
523 .BR select ()
524 ¤è¤ê°Ü¿¢À­¤ÎÌ̤ÇÎô¤Ã¤Æ¤¤¤¿¡£
525 .PP
526 Linux Æȼ«¤Î
527 .BR epoll (7)
528 API ¤Ï¡¢Â¿¿ô¤Î¥Õ¥¡¥¤¥ë¥Ç¥£¥¹¥¯¥ê¥×¥¿¤ò´Æ»ë¤¹¤ë¾ì¹ç¤Ë
529 .BR select (2)
530 ¤ä
531 .BR poll (2)
532 ¤è¤ê¤â¸úΨŪ¤Ê¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Æ¤¤¤ë¡£
533 .SH Îã
534 .BR select ()
535 ¤ÎËÜÅö¤ËÊØÍø¤ÊÅÀ¤ò¼¨¤¹¡¢¤è¤¤Îã¤ò¾Ò²ð¤¹¤ë¡£
536 °Ê²¼¤Î¥ê¥¹¥È¤Ï¡¢¤¢¤ë TCP ¥Ý¡¼¥È¤«¤éÊ̤Υݡ¼¥È¤ØžÁ÷¤ò¹Ô¤¦
537 TCP ¥Õ¥©¥ï¡¼¥É¥×¥í¥°¥é¥à¤Ç¤¢¤ë¡£
538 .PP
539 .nf
540 #include <stdlib.h>
541 #include <stdio.h>
542 #include <unistd.h>
543 #include <sys/time.h>
544 #include <sys/types.h>
545 #include <string.h>
546 #include <signal.h>
547 #include <sys/socket.h>
548 #include <netinet/in.h>
549 #include <arpa/inet.h>
550 #include <errno.h>
551
552 static int forward_port;
553
554 #undef max
555 #define max(x,y) ((x) > (y) ? (x) : (y))
556
557 static int
558 listen_socket(int listen_port)
559 {
560     struct sockaddr_in a;
561     int s;
562     int yes;
563
564     if ((s = socket(AF_INET, SOCK_STREAM, 0)) == \-1) {
565         perror("socket");
566         return \-1;
567     }
568     yes = 1;
569     if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
570             (char *) &yes, sizeof(yes)) == \-1) {
571         perror("setsockopt");
572         close(s);
573         return \-1;
574     }
575     memset(&a, 0, sizeof(a));
576     a.sin_port = htons(listen_port);
577     a.sin_family = AF_INET;
578     if (bind(s, (struct sockaddr *) &a, sizeof(a)) == \-1) {
579         perror("bind");
580         close(s);
581         return \-1;
582     }
583     printf("accepting connections on port %d\\n", listen_port);
584     listen(s, 10);
585     return s;
586 }
587
588 static int
589 connect_socket(int connect_port, char *address)
590 {
591     struct sockaddr_in a;
592     int s;
593
594     if ((s = socket(AF_INET, SOCK_STREAM, 0)) == \-1) {
595         perror("socket");
596         close(s);
597         return \-1;
598     }
599
600     memset(&a, 0, sizeof(a));
601     a.sin_port = htons(connect_port);
602     a.sin_family = AF_INET;
603
604     if (!inet_aton(address, (struct in_addr *) &a.sin_addr.s_addr)) {
605         perror("bad IP address format");
606         close(s);
607         return \-1;
608     }
609
610     if (connect(s, (struct sockaddr *) &a, sizeof(a)) == \-1) {
611         perror("connect()");
612         shutdown(s, SHUT_RDWR);
613         close(s);
614         return \-1;
615     }
616     return s;
617 }
618
619 #define SHUT_FD1 do {                                \\
620                      if (fd1 >= 0) {                 \\
621                          shutdown(fd1, SHUT_RDWR);   \\
622                          close(fd1);                 \\
623                          fd1 = \-1;                   \\
624                      }                               \\
625                  } while (0)
626
627 #define SHUT_FD2 do {                                \\
628                      if (fd2 >= 0) {                 \\
629                          shutdown(fd2, SHUT_RDWR);   \\
630                          close(fd2);                 \\
631                          fd2 = \-1;                   \\
632                      }                               \\
633                  } while (0)
634
635 #define BUF_SIZE 1024
636
637 int
638 main(int argc, char *argv[])
639 {
640     int h;
641     int fd1 = \-1, fd2 = \-1;
642     char buf1[BUF_SIZE], buf2[BUF_SIZE];
643     int buf1_avail, buf1_written;
644     int buf2_avail, buf2_written;
645
646     if (argc != 4) {
647         fprintf(stderr, "Usage\\n\\tfwd <listen-port> "
648                  "<forward-to-port> <forward-to-ip-address>\\n");
649         exit(EXIT_FAILURE);
650     }
651
652     signal(SIGPIPE, SIG_IGN);
653
654     forward_port = atoi(argv[2]);
655
656     h = listen_socket(atoi(argv[1]));
657     if (h == \-1)
658         exit(EXIT_FAILURE);
659
660     for (;;) {
661         int r, nfds = 0;
662         fd_set rd, wr, er;
663
664         FD_ZERO(&rd);
665         FD_ZERO(&wr);
666         FD_ZERO(&er);
667         FD_SET(h, &rd);
668         nfds = max(nfds, h);
669         if (fd1 > 0 && buf1_avail < BUF_SIZE) {
670             FD_SET(fd1, &rd);
671             nfds = max(nfds, fd1);
672         }
673         if (fd2 > 0 && buf2_avail < BUF_SIZE) {
674             FD_SET(fd2, &rd);
675             nfds = max(nfds, fd2);
676         }
677         if (fd1 > 0 && buf2_avail \- buf2_written > 0) {
678             FD_SET(fd1, &wr);
679             nfds = max(nfds, fd1);
680         }
681         if (fd2 > 0 && buf1_avail \- buf1_written > 0) {
682             FD_SET(fd2, &wr);
683             nfds = max(nfds, fd2);
684         }
685         if (fd1 > 0) {
686             FD_SET(fd1, &er);
687             nfds = max(nfds, fd1);
688         }
689         if (fd2 > 0) {
690             FD_SET(fd2, &er);
691             nfds = max(nfds, fd2);
692         }
693
694         r = select(nfds + 1, &rd, &wr, &er, NULL);
695
696         if (r == \-1 && errno == EINTR)
697             continue;
698
699         if (r == \-1) {
700             perror("select()");
701             exit(EXIT_FAILURE);
702         }
703
704         if (FD_ISSET(h, &rd)) {
705             unsigned int l;
706             struct sockaddr_in client_address;
707
708             memset(&client_address, 0, l = sizeof(client_address));
709             r = accept(h, (struct sockaddr *) &client_address, &l);
710             if (r == \-1) {
711                 perror("accept()");
712             } else {
713                 SHUT_FD1;
714                 SHUT_FD2;
715                 buf1_avail = buf1_written = 0;
716                 buf2_avail = buf2_written = 0;
717                 fd1 = r;
718                 fd2 = connect_socket(forward_port, argv[3]);
719                 if (fd2 == \-1)
720                     SHUT_FD1;
721                 else
722                     printf("connect from %s\\n",
723                             inet_ntoa(client_address.sin_addr));
724             }
725         }
726
727         /* NB: read oob data before normal reads */
728
729         if (fd1 > 0)
730             if (FD_ISSET(fd1, &er)) {
731                 char c;
732
733                 r = recv(fd1, &c, 1, MSG_OOB);
734                 if (r < 1)
735                     SHUT_FD1;
736                 else
737                     send(fd2, &c, 1, MSG_OOB);
738             }
739         if (fd2 > 0)
740             if (FD_ISSET(fd2, &er)) {
741                 char c;
742
743                 r = recv(fd2, &c, 1, MSG_OOB);
744                 if (r < 1)
745                     SHUT_FD2;
746                 else
747                     send(fd1, &c, 1, MSG_OOB);
748             }
749         if (fd1 > 0)
750             if (FD_ISSET(fd1, &rd)) {
751                 r = read(fd1, buf1 + buf1_avail,
752                           BUF_SIZE \- buf1_avail);
753                 if (r < 1)
754                     SHUT_FD1;
755                 else
756                     buf1_avail += r;
757             }
758         if (fd2 > 0)
759             if (FD_ISSET(fd2, &rd)) {
760                 r = read(fd2, buf2 + buf2_avail,
761                           BUF_SIZE \- buf2_avail);
762                 if (r < 1)
763                     SHUT_FD2;
764                 else
765                     buf2_avail += r;
766             }
767         if (fd1 > 0)
768             if (FD_ISSET(fd1, &wr)) {
769                 r = write(fd1, buf2 + buf2_written,
770                            buf2_avail \- buf2_written);
771                 if (r < 1)
772                     SHUT_FD1;
773                 else
774                     buf2_written += r;
775             }
776         if (fd2 > 0)
777             if (FD_ISSET(fd2, &wr)) {
778                 r = write(fd2, buf1 + buf1_written,
779                            buf1_avail \- buf1_written);
780                 if (r < 1)
781                     SHUT_FD2;
782                 else
783                     buf1_written += r;
784             }
785
786         /* check if write data has caught read data */
787
788         if (buf1_written == buf1_avail)
789             buf1_written = buf1_avail = 0;
790         if (buf2_written == buf2_avail)
791             buf2_written = buf2_avail = 0;
792
793         /* one side has closed the connection, keep
794            writing to the other side until empty */
795
796         if (fd1 < 0 && buf1_avail \- buf1_written == 0)
797             SHUT_FD2;
798         if (fd2 < 0 && buf2_avail \- buf2_written == 0)
799             SHUT_FD1;
800     }
801     exit(EXIT_SUCCESS);
802 }
803 .fi
804 .PP
805 ¾åµ­¤Î¥×¥í¥°¥é¥à¤Ï¡¢¤Û¤È¤ó¤É¤Î¼ïÎà¤Î TCP Àܳ¤ò¥Õ¥©¥ï¡¼¥É¤¹¤ë¡£
806 .B telnet
807 ¥µ¡¼¥Ð¤Ë¤è¤Ã¤ÆÃæ·Ñ¤µ¤ì¤ë OOB ¥·¥°¥Ê¥ë¥Ç¡¼¥¿¤â°·¤¨¤ë¡£
808 ¤³¤Î¥×¥í¥°¥é¥à¤Ï¡¢¥Ç¡¼¥¿¥Õ¥í¡¼¤òÁÐÊý¸þ¤ËƱ»þ¤ËÁ÷¤ë¤È¤¤¤¦¡¢
809 ¤ä¤ä¤³¤·¤¤ÌäÂê¤â½èÍý¤Ç¤­¤ë¡£
810 .BR fork (2)
811 ¥³¡¼¥ë¤ò»È¤Ã¤Æ¡¢³Æ¥¹¥È¥ê¡¼¥à¤´¤È¤ËÀìÍѤΥ¹¥ì¥Ã¥É¤òÍѤ¤¤ë¤Û¤¦¤¬¸úΨŪ¤À¡¢
812 ¤È¤¤¤¦¿Í¤â¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤¡£¤·¤«¤·¡¢¤³¤ì¤Ï¹Í¤¨¤Æ¤¤¤ë¤è¤ê¤º¤Ã¤È¤ä¤ä¤³¤·¤¤¡£
813 ¤¢¤ë¤¤¤Ï¡¢
814 .BR fcntl (2)
815 ¤ò»È¤Ã¤ÆÈó¥Ö¥í¥Ã¥¯ I/O ¤ò¥»¥Ã¥È¤¹¤ì¤ÐÎɤ¤¡¢¤È¤¤¤¦¥¢¥¤¥Ç¥¢¤â¤¢¤ë¤À¤í¤¦¡£
816 ¤³¤ì¤Ë¤â¼ÂºÝ¤Ë¤ÏÌäÂ꤬¤¢¤ê¡¢¥¿¥¤¥à¥¢¥¦¥È¤¬Èó¸úΨŪ¤Ëµ¯¤³¤Ã¤Æ¤·¤Þ¤¦¡£
817
818 ¤³¤Î¥×¥í¥°¥é¥à¤Ï°ìÅ٤ˤҤȤİʾå¤ÎƱ»þÀܳ¤ò°·¤¦¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤¬¡¢
819 ¤½¤ÎÍͤ˳ÈÄ¥¤¹¤ë¤Î¤Ï´Êñ¤Ç¡¢¥Ð¥Ã¥Õ¥¡¤Î¥ê¥ó¥¯¥ê¥¹¥È¤ò
820 (Àܳ¤´¤È¤Ë¤Ò¤È¤Ä¤º¤Ä) »È¤¨¤Ð¤è¤¤¡£
821 ¸½»þÅÀ¤Î¤â¤Î¤Ç¤Ï¡¢¿·¤·¤¤Àܳ¤¬¤¯¤ë¤È¸Å¤¤Àܳ¤ÏÍî¤Á¤Æ¤·¤Þ¤¦¡£
822 .SH ´ØÏ¢¹àÌÜ
823 .BR accept (2),
824 .BR connect (2),
825 .BR ioctl (2),
826 .BR poll (2),
827 .BR read (2),
828 .BR recv (2),
829 .BR select (2),
830 .BR send (2),
831 .BR sigprocmask (2),
832 .BR write (2),
833 .BR sigaddset (3),
834 .BR sigdelset (3),
835 .BR sigemptyset (3),
836 .BR sigfillset (3),
837 .BR sigismember (3),
838 .BR epoll (7)
839 .\" .SH AUTHORS
840 .\" This man page was written by Paul Sheer.