select
ΠΡΠ΅Π½Ρ ΡΠ°ΡΡΠΎ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Linux Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΡΠ΄Π° Π²Π²ΠΎΠ΄ΠΎΠ² Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ, ΡΠ°ΠΊΠ°Ρ ΠΊΠ°ΠΊ ΡΠΌΡΠ»ΡΡΠΎΡ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°, Π½ΡΠΆΠ΄Π°Π΅ΡΡΡ Π² ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΌ ΡΠΏΠΎΡΠΎΠ±Π΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡ Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΠΈ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ°. Π ΠΎΠ΄Π½ΠΎΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΡΠΈΠΊΠ» "Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ", ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΠΈΠΉ Π²Π²ΠΎΠ΄ Π² ΠΏΠΎΠΈΡΠΊΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΈ ΡΠΈΡΠ°ΡΡΠΈΠΉ ΠΈΡ
, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²ΡΡΡΡ. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΡΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π¦Π.
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ²
select
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΆΠ΄Π°ΡΡ ΠΏΡΠΈΠ±ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ
(ΠΈΠ»ΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ²ΠΎΠ΄Π°) ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ
Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°Ρ
. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΌΡΠ»ΡΡΠΎΡΠ° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° ΠΌΠΎΠΆΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ Π΄ΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Ρ Π½Π΅Π΅ Π½Π΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΡΠ°Π±ΠΎΡΠ°. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π΄Π΅Π»ΠΎ Ρ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΎΠΆΠΈΠ΄Π°Ρ Π·Π°ΠΏΡΠΎΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ
ΠΎΡΠΊΡΡΡΡΡ
ΡΠΎΠΊΠ΅ΡΠ°Ρ
.
Π€ΡΠ½ΠΊΡΠΈΡ
select
ΠΎΠΏΠ΅ΡΠΈΡΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ
fd_set
, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΌΠΈ ΡΠΎΠ±ΠΎΠΉ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΎΡΠΊΡΡΡΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ
Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ². ΠΠ»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠΈΡ
ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ²:
<b>#include <sys/types.h> #include <sys/time.h></b>
<b>void FD_ZERO(fd_set *fdset);</b>
<b>void FD_CLR(int fd, fd_set *fdset);</b>
<b>void FD_SET(int fd, fd_set *fdset);</b>
<b>int FD_ISSET(int fd, fd_set *fdset);</b>
ΠΠ°ΠΊ ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΈΡ
ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΠΌΠ°ΠΊΡΠΎΡ
FD_ZERO
ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ
fd_set
ΠΏΡΡΡΡΠΌ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ,
FD_SET
ΠΈ
FD_CLR
Π·Π°Π΄Π°ΡΡ ΠΈ ΠΎΡΠΈΡΠ°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΌΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠΌΡ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ
fd
, Π° ΠΌΠ°ΠΊΡΠΎΡ
FD_ISSET
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ»Π°Π΅ΡΡΡ
fd
, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ ΡΡΡΡΠΊΡΡΡΡ
fd_set
, Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ
fdset
. ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ
Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π² ΡΡΡΡΠΊΡΡΡΠ΅ ΡΠΈΠΏΠ°
fd_set
Π·Π°Π΄Π°Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ
FD_SETDIZE
.
Π€ΡΠ½ΠΊΡΠΈΡ
select
ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅. ΠΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΡΡΠΊΡΡΡΡ
struct timeval
. ΠΠ½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π² ΡΠ°ΠΉΠ»Π΅ sys/time.h ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ:
<b>struct timeval {</b>
<b>Β time_t tv_sec;Β /* Π‘Π΅ΠΊΡΠ½Π΄Ρ */</b>
<b>Β long tv_usec;Β /* ΠΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Ρ */</b>
<b>}</b>
Π’ΠΈΠΏ
time_t
, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π² ΡΠ°ΠΉΠ»Π΅ sys/types.h, β ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ. Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ²
select
ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
<b>#include <sys/types.h></b>
<b>#include <sys/time.h></b>
<b>int select(int nfds, fd_set *readfds, fd_set *writefds,</b>
<b>Β fd_set *errorfds, struct timeval *timeout);</b>
ΠΡΠ·ΠΎΠ²
select
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π½Π΅ Π³ΠΎΡΠΎΠ² Π»ΠΈ Ρ
ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ
Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΊ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ, ΠΈΠ»ΠΈ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π»ΠΈ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΠΈΠ·-Π·Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ².
ΠΡΠ³ΡΠΌΠ΅Π½Ρ
nfds
Π·Π°Π΄Π°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ
Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², ΠΈΠΌΠ΅ΡΡΡΡ Π² Π²ΠΈΠ΄Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΠΎΡ 0 Π΄ΠΎ
nfds-1
. ΠΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΡΡΠ΅Ρ
ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΡΡΡΡΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ, ΡΠΎΠ³Π΄Π° ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ Ρ Π½ΠΈΠΌ ΡΠ΅ΡΡ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ.
Π€ΡΠ½ΠΊΡΠΈΡ
select
Π²Π΅ΡΠ½Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅
readfds
Π³ΠΎΡΠΎΠ² ΠΊ ΡΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΈΠ· ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°
writefds
Π³ΠΎΡΠΎΠ² ΠΊ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ»ΠΈ Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°
errorfd
Π΅ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΡΠ»ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΡΠ»ΠΎΠ²ΠΈΠΉ Π½Π΅ ΡΠΎΠ±Π»ΡΠ΄Π°Π΅ΡΡΡ,
select
Π²Π΅ΡΠ½Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ
timeout
. ΠΡΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ
timeout
β ΠΏΡΡΡΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈ Π½Π΅Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ Π½Π° ΡΠΎΠΊΠ΅ΡΠ°Ρ
, Π²ΡΠ·ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ Π½Π° Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ.
ΠΠΎΠ³Π΄Π°
select
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π±ΡΠ΄ΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Ρ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ Π½Π° Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΊ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅ΡΡΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ. ΠΠ»Ρ ΠΈΡ
ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΡ
FD_ISSET
, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΡΠ΅Π±ΡΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ. ΠΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ timeout Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π²ΡΠ΅ΠΌΡ, ΠΎΡΡΠ°ΡΡΠ΅Π΅ΡΡ Π΄ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π²ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π½ΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ X/Open. ΠΡΠΈ ΠΏΡΠ΅Π²ΡΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π²ΡΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π±ΡΠ΄ΡΡ ΠΎΡΠΈΡΠ΅Π½Ρ.
ΠΡΠ·ΠΎΠ² select Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π² ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°Ρ
. Π ΡΠ»ΡΡΠ°Π΅ ΡΠ±ΠΎΡ ΠΎΠ½ Π²Π΅ΡΠ½Π΅Ρ -1 ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
errno
, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠ΅Π΅ ΠΎΡΠΈΠ±ΠΊΡ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ β
EBADF
Π΄Π»Ρ Π½Π΅Π²Π΅ΡΠ½ΡΡ
Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ²,
EINTR
Π΄Π»Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΈΠ·-Π·Π° ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΈ
EINVAL
Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²
nfds
ΠΈΠ»ΠΈ
timeout
.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Linux ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ
timeout
, ΡΠΈΠΊΡΠΈΡΡΡ ΠΎΡΡΠ°Π²ΡΠ΅Π΅ΡΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π²Π΅ΡΡΠΈΠΉ UNIX ΡΡΠΎΠ³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡΡ. ΠΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΠ΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΡ
select
, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΡΠΈΠΏΠ°
timeval
ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ Π±Π΅Π· ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ. Π ΡΠΈΡΡΠ΅ΠΌΠ΅ Linux ΡΡΠΎΡ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΠ‘ Linux ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ
timeval
ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΎΡΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΡ
select
, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ ΡΡΡ ΡΠ°Π·Π½ΠΈΡΡ ΠΈ Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ. ΠΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ ΠΎΠ±Π° ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Ρ, ΠΎΠ½ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ°Π·Π½ΡΠ΅!
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.8.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.8. Π€ΡΠ½ΠΊΡΠΈΡ
select
ΠΠ°Π»Π΅Π΅ Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ select ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° select.c. ΠΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΈΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ (ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²Π²ΠΎΠ΄ β Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ 0) ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ 2,5 ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΠ°Π½Π½ΡΠ΅ ΡΠΈΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π²Π²ΠΎΠ΄ Π³ΠΎΡΠΎΠ². ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π²ΠΊΠ»ΡΡΠΈΠ² Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΈΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ (serial lines) ΠΈ ΡΠΎΠΊΠ΅ΡΡ.