ࡱ> `bjbjss.`KFFFF|,?2    ?!?!?!?!?!?!?$AhvCVE?Q$ $$E?  ?111$  ?1$?11r_;T_<  F-;??0?;C{0vC_<_<LC>t  "1"y#~ E?E?0 ?$$$$d"$ " 5:F8O 8. C;LB8?;5:A8@>20=85 22>40/2K2>40 8 0A8=E@>==K9 22>4/2K2>4  E>45 MB>9 ;5:F88 2K 87CG8B5 A?>;L7>20=85 A8AB5<=>3> 2K7>20 select A?>;L7>20=85 A8AB5<=>3> 2K7>20 poll 5:>B>@K5 0A?5:BK 8A?>;L7>20=8O select/poll 2 <=>3>?>B>G=KE ?@>3@0<<0E !B0=40@B=K5 A@54AB20 0A8=E@>==>3> 22>40/2K2>40 !8AB5<=K9 2K7>2 select A;8 20H0 ?@>3@0<<0 3;02=K< >1@07>< 70=8<05BAO >?5@0F8O<8 22>40/2K2>40, 2K <>65B5 ?>;CG8BL =081>;55 206=K5 87 ?@58<CI5AB2 <=>3>?>B>G=>AB8 2 >4=>?>B>G=>9 ?@>3@0<<5, 8A?>;L7CO A8AB5<=K9 2K7>2 select(3C).  1>;LH8=AB25 Unix-A8AB5< select O2;O5BAO A8AB5<=K< 2K7>2><, 8;8, 2> 2AO:>< A;CG05, >?8AK205BAO 2 A5:F88 A8AB5<=>3> @C:>2>4AB20 2 (A8AB5<=K5 2K7>2K), B.5. AAK;:0 =0 =53> 4>;6=0 1K;0 1K 2K3;O45BL :0: select(2), => 2 Solaris 10 A>>B25BAB2CNI0O AB@0=8F0 A8AB5<=>3> @C:>2>4AB20 @07<5I5=0 2 A5:F88 3C (AB0=40@B=0O 181;8>B5:0 O7K:0 !). #AB@>9AB20 22>40/2K2>40 >1KG=> @01>B0NB 3>@074> <54;5==55 F5=B@0;L=>3> ?@>F5AA>@0, ?>MB><C ?@8 2K?>;=5=88 >?5@0F89 A =8<8 ?@>F5AA>@ >1KG=> >:07K205BAO 2K=C645= 640BL 8E. >MB><C 2> 2A5E ! A8AB5<=K5 2K7>2K A8=E@>==>3> 22>40/2K2>40 ?@54AB02;ONB A>1>9 1;>:8@CNI85AO >?5@0F88. -B> >B=>A8BAO 8 : A5B52K< :><<C=8:0F8O<  2708<>459AB285 G5@57 =B5@=5B A>?@O65=> A 1>;LH8<8 7045@6:0<8 8, :0: ?@028;>, ?@>8AE>48B G5@57 =5 >G5=L H8@>:89 8/8;8 ?5@53@C65==K9 :0=0; A2O78. A;8 20H0 ?@>3@0<<0 @01>B05B A =5A:>;L:8<8 CAB@>9AB20<8 22>40/2K2>40 8/8;8 A5B52K<8 A>548=5=8O<8, 59 =52K3>4=> 1;>:8@>20BLAO =0 >?5@0F88, A2O70==>9 A >4=8< 87 MB8E CAB@>9AB2, 254L 2 B0:>< A>AB>O=88 >=0 <>65B ?@>?CAB8BL 2>7<>6=>ABL A>25@H8BL 22>4/2K2>4 A 4@C3>3> CAB@>9AB20 157 1;>:8@>2:8. -BC ?@>1;5<C <>6=> @5H0BL ?@8 ?><>I8 A>740=8O =8B59, @01>B0NI8E A @07;8G=K<8 CAB@>9AB20<8.  ?@54K4CI8E ;5:F8OE <K 87CG8;8 2A5 =5>1E>48<>5 4;O @07@01>B:8 B0:8E ?@>3@0<<. 4=0:> 4;O @5H5=8O MB>9 ?@>1;5<K 5ABL 8 4@C385 A@54AB20. !8AB5<=K9 2K7>2 select(3C) ?>72>;O5B >6840BL 3>B>2=>AB8 =5A:>;L:8E CAB@>9AB2 8;8 A5B52KE A>548=5=89 (2 459AB28B5;L=>AB8, 3>B>2=>AB8 >1J5:B>2 1>;LH8=AB20 B8?>2, :>B>@K5 <>3CB 1KBL 845=B8D8F8@>20=K D09;>2K< 45A:@8?B>@><). >340 >48= 8;8 =5A:>;L:> 87 45A:@8?B>@>2 >:07K20NBAO 3>B>2K ?5@540BL 40==K5, select(3C) 2>72@0I05B C?@02;5=85 ?@>3@0<<5 8 ?5@5405B A?8A:8 3>B>2KE 45A:@8?B>@>2 2 2KE>4=KE ?0@0<5B@0E.  :0G5AB25 ?0@0<5B@>2 select(3C) 8A?>;L7C5B <=>65AB20 (=01>@K) 45A:@8?B>@>2.  AB0@KE Unix-A8AB5<0E <=>65AB20 1K;8 @50;87>20=K 2 2845 1024-@07@O4=KE 18B>2KE <0A>:.  A>2@5<5==KE Unix-A8AB5<0E 8 2 4@C38E !, @50;87CNI8E select, <=>65AB20 @50;87>20=K 2 2845 =5?@>7@0G=>3> B8?0 fd_set, =04 :>B>@K< >?@545;5=K =5:>B>@K5 B5>@5B8:>-<=>65AB25==K5 >?5@0F88, 0 8<5==>  >G8AB:0 <=>65AB20, 2:;NG5=85 45A:@8?B>@0 2 <=>65AB2>, 8A:;NG5=85 45A:@8?B>@0 87 <=>65AB20 8 ?@>25@:0 =0;8G8O 45A:@8?B>@0 2 <=>65AB25. @5?@>F5AA>@=K5 48@5:B82K 4;O 2K?>;=5=8O MB8E >?5@0F89 >?8A0=K =0 AB@0=8F5 @C:>2>4AB20 select(3C).  32-@07@O4=KE 25@A8OE Unix SVR4, 2 B>< G8A;5 2 Solaris, fd_set ?> ?@56=5<C ?@54AB02;O5B A>1>9 1024-18B>2CN <0A:C; 2 64-@07@O4=KE 25@A8OE SVR4 MB> <0A:0 @07@O4=>AB8 65536 18B. 07<5@ <0A:8 >?@545;O5B =5 B>;L:> <0:A8<0;L=>5 :>;8G5AB2> D09;>2KE 45A:@8?B>@>2 2 =01>@5, => 8 <0:A8<0;L=K9 =><5@ D09;>2>3> 45A:@8?B>@0 2 =01>@5. 07<5@ <0A:8 2 20H59 25@A88 A8AB5<K <>6=> >?@545;8BL 2> 2@5<O :><?8;OF88 ?> 7=0G5=8N ?@5?@>F5AA>@=>3> A8<2>;0 FD_SETSIZE. C<5@0F8O D09;>2KE 45A:@8?B>@>2 2 Unix =0G8=05BAO A 0, ?>MB><C <0:A8<0;L=K9 =><5@ 45A:@8?B>@0 @025= FD_SETSIZE-1. "0:8< >1@07><, 5A;8 2K 8A?>;L7C5B5 select(3C), 20< =5>1E>48<> CAB0=>28BL >3@0=8G5=8O =0 :>;8G5AB2> 45A:@8?B>@>2 20H53> ?@>F5AA0. -B> <>65B 1KBL A45;0=> H5;;>2A:>9 :><0=4>9 ulimit(1) ?5@54 70?CA:>< ?@>F5AA0 8;8 A8AB5<=K< 2K7>2>< setrlimit(2) C65 2> 2@5<O 8A?>;=5=8O 20H53> ?@>F5AA0. 07C<55BAO, setrlimit(2) =5>1E>48<> 2K720BL 4> B>3>, :0: 2K =0G=5B5 A>74020BL D09;>2K5 45A:@8?B>@K. A;8 20< =5>1E>48<> 8A?>;L7>20BL 1>;55 1024 45A:@8?B>@>2 2 32-18B=>9 ?@>3@0<<5, Solaris 10 ?@54>AB02;O5B ?5@5E>4=K9 API. ;O 53> 8A?>;L7>20=8O =5>1E>48<> >?@545;8BL ?@5?@>F5AA>@=K9 A8<2>; FD_SETSIZE A G8A;>2K< 7=0G5=85<, ?@52KH0NI8< 1024, ?5@54 2:;NG5=85< D09;0 <sys/time.h>. @8 MB>< 2 D09;5 <sys/select.h> A@01>B0NB =5>1E>48<K5 ?@5?@>F5AA>@=K5 48@5:B82K 8 B8? fd_set 1C45B >?@545;5= :0: 1>;LH0O 18B>20O <0A:0, 0 select 8 4@C385 A8AB5<=K5 2K7>2K MB>3> A5<59AB20 1C4CB ?5@5>?@545;5=K 4;O 8A?>;L7>20=8O <0A>: B0:>3> @07<5@0.  =5:>B>@KE @50;870F8OE fd_set @50;87>20= 4@C38<8 A@54AB20<8, 157 8A?>;L7>20=8O 18B>2KE <0A>:. 0?@8<5@, Win32 ?@54>AB02;O5B select 2 A>AB025 B0: =07K205<>3> Winsock API.  Win32 fd_set @50;87>20= :0: 48=0<8G5A:89 <0AA82, A>45@60I89 7=0G5=8O D09;>2KE 45A:@8?B>@>2. >MB><C 20< =5 A;54C5B ?>;030BLAO =0 7=0=85 2=CB@5==59 AB@C:BC@K B8?0 fd_set. "0: 8;8 8=0G5, 87<5=5=8O @07<5@0 18B>2>9 <0A:8 fd_set 8;8 2=CB@5==53> ?@54AB02;5=8O MB>3> B8?0 B@51CNB ?5@5:><?8;OF88 2A5E ?@>3@0<<, 8A?>;L7CNI8E select(3C).  1C4CI5<, :>340 0@E8B5:BC@=K9 ;8<8B 2 65536 45A:@8?B>@>2 =0 ?@>F5AA 1C45B ?>2KH5=, <>65B ?>B@51>20BLAO =>20O 25@A8O @50;870F88 fd_set 8 select 8 =>20O ?5@5:><?8;OF8O ?@>3@0<<. 'B>1K 871560BL MB>3> 8 C?@>AB8BL ?5@5E>4 =0 =>2CN 25@A8N ABI, :><?0=8O Sun Microsystems @5:><5=4C5B >B:07K20BLAO >B 8A?>;L7>20=8O select(3C) 8 8A?>;L7>20BL 2<5AB> =53> A8AB5<=K9 2K7>2 poll(2). !8AB5<=K9 2K7>2 poll(2) @0AA<0B@8205BAO 40;55 =0 MB>9 ;5:F88. !8AB5<=K9 2K7>2 select(3C) 8<55B ?OBL ?0@0<5B@>2. int nfds  G8A;>, =0 548=8FC 1>;LH55, G5< <0:A8<0;L=K9 =><5@ D09;>2>3> 45A:@8?B>@0 2> 2A5E <=>65AB20E, ?5@540==KE :0: ?0@0<5B@K. fd_set *readfds  E>4=>9 ?0@0<5B@, <=>65AB2> 45A:@8?B>@>2, :>B>@K5 A;54C5B ?@>25@OBL =0 3>B>2=>ABL : GB5=8N. >=5F D09;0 8;8 70:@KB85 A>:5B0 AG8B05BAO G0AB=K< A;CG05< 3>B>2=>AB8 : GB5=8N. 53C;O@=K5 D09;K 2A5340 AG8B0NBAO 3>B>2K<8 : GB5=8N. "0:65, 5A;8 2K E>B8B5 ?@>25@8BL A;CH0NI89 A>:5B TCP =0 3>B>2=>ABL : 2K?>;=5=8N accept(3SOCKET), 53> A;54C5B 2:;NG8BL 2 MB> <=>65AB2>. "0:65, 2KE>4=>9 ?0@0<5B@, <=>65AB2> 45A:@8?B>@>2, 3>B>2KE : GB5=8N. fd_set *writefds  E>4=>9 ?0@0<5B@, <=>65AB2> 45A:@8?B>@>2, :>B>@K5 A;54C5B ?@>25@OBL =0 3>B>2=>ABL : 70?8A8. H81:0 ?@8 >B;>65==>9 70?8A8 AG8B05BAO G0AB=K< A;CG05< 3>B>2=>AB8 : 70?8A8. 53C;O@=K5 D09;K 2A5340 3>B>2K : 70?8A8. "0:65, 5A;8 2K E>B8B5 ?@>25@8BL 7025@H5=85 >?5@0F88 0A8=E@>==>3> connect(3SOCKET), A>:5B A;54C5B 2:;NG8BL 2 MB> <=>65AB2>. "0:65, 2KE>4=>9 ?0@0<5B@, <=>65AB2> 45A:@8?B>@>2, 3>B>2KE : 70?8A8. fd_set *errorfds  E>4=>9 ?0@0<5B@, <=>65AB2> 45A:@8?B>@>2, :>B>@K5 A;54C5B ?@>25@OBL =0 =0;8G85 8A:;NG8B5;L=KE A>AB>O=89. ?@545;5=85 8A:;NG8B5;L=>3> A>AB>O=8O 7028A8B >B B8?0 D09;>2>3> 45A:@8?B>@0. ;O A>:5B>2 TCP 8A:;NG8B5;L=>5 A>AB>O=85 2>7=8:05B ?@8 ?@8E>45 2=5?>;>A=KE 40==KE. 53C;O@=K5 D09;K 2A5340 AG8B0NBAO =0E>4OI8<8AO 2 8A:;NG8B5;L=>< A>AB>O=88. "0:65, 2KE>4=>9 ?0@0<5B@, <=>65AB2> 45A:@8?B>@>2, =0 :>B>@KE 2>7=8:;8 8A:;NG8B5;L=K5 A>AB>O=8O. struct timeval * timeout  B09<-0CB, 2@5<5==>9 8=B5@20;, 7040205<K9 A B>G=>ABLN 4> <8:@>A5:C=4. A;8 MB>B ?0@0<5B@ @025= NULL, B> select(3C) 1C45B >6840BL =5>3@0=8G5==>5 2@5<O; 5A;8 2 AB@C:BC@5 7040= =C;52>9 8=B5@20; 2@5<5=8, select(3C) @01>B05B 2 @568<5 >?@>A0, B> 5ABL 2>72@0I05B C?@02;5=85 =5<54;5==>, 2>7<>6=> A ?CABK<8 =01>@0<8 45A:@8?B>@>2. <5AB> 2A5E ?0@0<5B@>2 B8?0 fd_set * <>6=> ?5@540BL =C;52>9 C:070B5;L. -B> >7=0G05B, GB> A>>B25BAB2CNI89 :;0AA A>1KB89 =0A =5 8=B5@5AC5B. select(3C) 2>72@0I05B >1I55 :>;8G5AB2> 3>B>2KE 45A:@8?B>@>2 2> 2A5E <=>65AB20E ?@8 =>@<0;L=>< 7025@H5=88 (2 B>< G8A;5 ?@8 7025@H5=88 ?> B09<-0CBC), 8 -1 ?@8 >H81:5.  ?@8<5@5 1 ?@82>48BAO 8A?>;L7>20=85 select(3C) 4;O :>?8@>20=8O 40==KE 87 A5B52>3> A>548=5=8O =0 B5@<8=0;, 0 A B5@<8=0;0  2 A5B52>5 A>548=5=85. -B0 ?@>3@0<<0 C?@>I5==0O, >=0 ?@54?>;0305B, GB> 70?8AL =0 B5@<8=0; 8 2 A5B52>5 A>548=5=85 =8:>340 =5 1C45B 701;>:8@>20=0. >A:>;L:C 8 B5@<8=0;, 8 A5B52>5 A>548=5=85 8<5NB 2=CB@5==85 1CD5@K, ?@8 =51>;LH8E ?>B>:0E 40==KE MB> >1KG=> B0: 8 5ABL. @8<5@ 1. 2CAB>@>==55 :>?8@>20=85 40==KE <564C B5@<8=0;>< 8 A5B52K< A>548=5=85<. @8<5@ 27OB 87 :=838 #. . !B825=A, Unix: @07@01>B:0 A5B52KE ?@8;>65=89. <5AB> AB0=40@B=KE A8AB5<=KE 2K7>2>2 8A?>;L7CNBAO >15@B:8, >?8A0==K5 2 D09;5  unp.h #include "unp.h" void str_cli(FILE *fp, int sockfd) { int maxfdp1, stdineof; fd_set rset; char sendline[MAXLINE], recvline[MAXLINE]; stdineof = 0; FD_ZERO(&rset); for ( ; ; ) { if (stdineof == 0) FD_SET(fileno(fp), &rset); FD_SET(sockfd, &rset); maxfdp1 = max(fileno(fp), sockfd) + 1; Select(maxfdp1, &rset, NULL, NULL, NULL); if (FD_ISSET(sockfd, &rset)) { /* socket is readable */ if (Readline(sockfd, recvline, MAXLINE) == 0) { if (stdineof == 1) return; /* normal termination */ else err_quit("str_cli: server terminated prematurely"); } Fputs(recvline, stdout); } if (FD_ISSET(fileno(fp), &rset)) { /* input is readable */ if (Fgets(sendline, MAXLINE, fp) == NULL) { stdineof = 1; Shutdown(sockfd, SHUT_WR); /* send FIN */ FD_CLR(fileno(fp), &rset); continue; } Writen(sockfd, sendline, strlen(sendline)); } } } 1@0B8B5 2=8<0=85, GB> ?@>3@0<<0 ?@8<5@0 1 70=>2> ?5@5A>7405B <=>65AB20 45A:@8?B>@>2 ?5@54 :064K< 2K7>2>< select(3C). -B> =5>1E>48<>, ?>B><C GB> ?@8 =>@<0;L=>< 7025@H5=88 select(3C) <>48D8F8@C5B A2>8 ?0@0<5B@K. select(3C) AG8B05BAO MT-Safe, >4=0:> ?@8 53> 8A?>;L7>20=88 2 <=>3>?>B>G=>9 ?@>3@0<<5 =04> 8<5BL 2 284C A;54CNI89 <><5=B. 59AB28B5;L=>, A0< ?> A515 select(3C) =5 8A?>;L7C5B ;>:0;L=KE 40==KE 8 ?>MB><C 53> 2K7>2 87 =5A:>;L:8E =8B59 =5 4>;65= ?@82>48BL : ?@>1;5<0<. 4=0:> 5A;8 =5A:>;L:> =8B59 @01>B0NB A ?5@5A5:0NI8<8AO =01>@0<8 D09;>2KE 45A:@8?B>@>2, 2>7<>65= B0:>9 AF5=0@89: 8BL 1 2:;NG05B 45A:@8?B>@ s 2 =01>@ readfds 8 2K7K205B select. select 2 =8B8 1 2>72@0I05B s :0: 3>B>2K9 4;O GB5=8O 8BL 2 2:;NG05B 45A:@8?B>@ s 2 =01>@ readfds 8 2K7K205B select select 2 =8B8 2 2>72@0I05B s :0: 3>B>2K9 4;O GB5=8O 8BL 1 2K7K205B read 87 45A:@8?B>@0 s 8 ?>;CG05B 2A5 40==K5 87 53> 1CD5@0 8BL 2 2K7K205B read 87 45A:@8?B>@0 s 8 1;>:8@C5BAO. 'B>1K 871560BL MB>3> AF5=0@8O, @01>BC A D09;>2K<8 45A:@8?B>@0<8 2 HJVX|~   T \ : < j x    * 2 4 B N P   6 XZ\`bd>(*nz~ j|~h^ LhvmH sH hv hvhvhbLmH sH  haqhbL hbLhbL haqhaqhaqhbLM ^ J x >Nt "%&)T,0Z1\25&9<t?^gd]zgdbL & FgdbLgdbLgdbLDFrt"*,.:>XZ $*NVX^` 4:> !!!!!!!ϼϴh]zmH sH h]zh$~ h=(haqh=(mH sH h=( h=(h=(haqmH sH  haqhaqhaqh^ Lhv hvhvhvmH sH C!!f"j"l"z""""""""###L$^$f$$$$%%"&0&8&j&p&v&&&&''''''''''''''''''''\(`(b(h(j(((()))))))t*z************hbLhaq h=(h=(h=(mH sH h=( h]zh=(h]zmH sH h]z h]zh]zP*+ +++++D,H,J,P,T,,,,,,x-----........h/n/r///////0 0 00f0n00001"1&1(1,1Z1`1b1j1p11\2`2b2h2l2z2|2~228333F44hwhgt hgthgt hgth]zh`-h h]zh]zh]zmH sH h]zh=( h=(h=(h=(mH sH H44444455555555566P7R7T77(868:8F8L88&9*9,92969F9L9:::f;;<<<<<<<<<x=~=========> >>>>>>??????(@@@@@@ h,rh,rh,rmH sH  h`-hh`-hh`-hmH sH hwh`-hh]zhgt hgthgthgtmH sH L@AA B,B0B2B6BjBDDEEEFFFFFFKKLLLLLM M$M&M*MbMdMpMtMvMzMMMMMM8NNNNNNTPVPPPPPPPPPPPP Q񬤝 hoYhoYhoYmH sH hoY h,rh,rCJOJQJ^JaJ(h,rh,rCJOJQJ^JaJmH sH h,rmH sH hgt h,rh`-hh`-hmH sH h`-h h,rh,rh,r>t?ADFFF6GhGGGGHH HPHiHHHH+IcIIIIII JhJJgd,rgdgtJJ&KBKLKKKKKdMVPP>QQ$RR"Sm4nnoo(pp>s & FgdoY & FgdwgdoY & FgdoYgdgtgd,r QQQtQvQxQQQQQQQQQQQQDRLRNRlRnRpRRRRSSSSjkkk"kTkkkl l"lmmmmmmm nn$n0n4n@nBnjnlnnnnnnnnn ooo&o(oPoRoTooooožžžžžžžžžžž hoYhwhwmH sH hmH sH  hhhhw hhoYUhoY hoYhoYhoYmH sH KB0:8E CA;>28OE A;54C5B 70I8I0BL <CB5:A0<8 8;8 :0:8<8-B> 4@C38<8 ?@8<8B820<8 2708<>8A:;NG5=8O. 06=> ?>4G5@:=CBL, GB> 70I8I0BL =04> =5 select, 0 8<5==> ?>A;54>20B5;L=>ABL >?5@0F89 =04 :>=:@5B=K< D09;>2K< 45A:@8?B>@><, =0G8=0O A 2:;NG5=8O 45A:@8?B>@0 2 <=>65AB2> 4;O select 8 70:0=G820O ?@85<>< 40==KE 87 MB>3> 45A:@8?B>@0, B>G=55, >1=>2;5=85< C:070B5;59 2 1CD5@5, 2 :>B>@K9 2K AG8B0;8 MB8 40==K5. A;8 MB>3> =5 A45;0BL, 2>7<>6=K 5I5 1>;55 C2;5:0B5;L=K5 AF5=0@88, =0?@8<5@: 8BL 1 2:;NG05B 45A:@8?B>@ s 2 =01>@ readfds 8 2K7K205B select. select 2 =8B8 1 2>72@0I05B s :0: 3>B>2K9 4;O GB5=8O 8BL 2 2:;NG05B 45A:@8?B>@ s 2 =01>@ readfds 8 2K7K205B select select 2 =8B8 2 2>72@0I05B s :0: 3>B>2K9 4;O GB5=8O 8BL 1 2K7K205B read 87 45A:@8?B>@0 s 8 ?>;CG05B B>;L:> G0ABL 40==KE 87 53> 1CD5@0 8BL 2 2K7K205B read 87 45A:@8?B>@0 s, ?>;CG05B 40==K5 8 70?8AK205B 8E ?>25@E 40==KE, ?>;CG5==KE =8BLN 1  ;5:F88 10 <K @0AA<>B@8< 0@E8B5:BC@C ?@8;>65=8O, 2 :>B>@>< =5A:>;L:> =8B59 @01>B0NB A >1I8< ?C;>< D09;>2KE 45A:@8?B>@>2  B0: =07K205<CN 0@E8B5:BC@C @01>G8E =8B59 (worker threads). @8 MB>< =8B8, @07C<55BAO, 4>;6=K C:07K20BL 4@C3 4@C3C, A :0:8<8 8<5==> 45A:@8?B>@0<8 >=8 A59G0A @01>B0NB. C;LB8?;5:A8@>20=85 22>40 ?@8 ?><>I8 poll(2) !8AB5<=K9 2K7>2 poll(2) 2K?>;=O5B ?@81;878B5;L=> B5 65 7040G8, GB> 8 select(3C), => 8A?>;L7C5B =5A:>;L:> 1>;55 C4>1=K9 A?>A>1 ?5@540G8 8=D>@<0F88 > B><, :0:85 45A:@8?B>@K 53> 8=B5@5ACNB. poll(2) 8<55B B@8 ?0@0<5B@0: struct pollfd fds[]  <0AA82 >?8A0B5;59 45A:@8?B>@>2. !B@C:BC@0 pollfd >1AC6405BAO 40;55 2 MB>< @0745;5 nfds_t nfds  :>;8G5AB2> >?8A0B5;59 2 <0AA825 fds int timeout  B09<-0CB 2 <8;;8A5:C=40E. A;8 ?0@0<5B@ timeout @025= 0, poll @01>B05B 2 @568<5 >?@>A0 (2>72@0I05B C?@02;5=85 =5<54;5==>). A;8 >= @025= -1, poll 645B 3>B>2=>AB8 45A:@8?B>@>2 =5>3@0=8G5==>5 2@5<O. poll(2) 2>72@0I05B :>;8G5AB2> 45A:@8?B>@>2, A :>B>@K<8 ?@>87>H;8 :0:85-B> A>1KB8O, 70?@>H5==K5 ?@>3@0<<>9 ;81> ?@54AB02;ONI85 8=B5@5A 4;O =55. A;8 poll(2) 2>72@0I05B C?@02;5=85 ?> B09<-0CBC, :>4 2>72@0B0 1C45B @025= 0. @8 >H81:5 poll(2) 2>72@0I05B -1 8 CAB0=02;8205B errno. !B@C:BC@0 pollfd 8<55B A;54CNI85 ?>;O: int fd  45A:@8?B>@ D09;0. A;8 MB> ?>;5 8<55B >B@8F0B5;L=>5 7=0G5=85, 70?8AL 83=>@8@C5BAO. short events  A>1KB8O, A2O70==K5 A fd, :>B>@K5 =0A 8=B5@5ACNB. short revents  return events, A>1KB8O, A2O70==K5 A fd, :>B>@K5 @50;L=> ?@>87>H;8. @8 2K7>25 poll ?>;L7>20B5;L 4>;65= 70?>;=8BL ?>;O fd 8 events; ?>;5 revents 70?>;=O5BAO A8AB5<=K< 2K7>2><. >;O events 8 revents ?@54AB02;ONB A>1>9 18B>2K5 <0A:8, 18BK :>B>@KE A>>B25BAB2CNB B8?0< A>1KB89. <5AB> 18B>2 @5:><5=4C5BAO 8A?>;L7>20BL A8<2>;L=K5 :>=AB0=BK, >?@545;5==K5 2 <poll.h> A=>2=K5 8A?>;L7C5<K5 B8?K A>1KB89  POLLIN (?@>25@OBL 3>B>2=>ABL : GB5=8N), 8 POLLOUT (?@>25@OBL 3>B>2=>ABL : 70?8A8).  459AB28B5;L=>AB8, MB8 B8?K :><?>78B=K5 8 ?@54AB02;ONB A>1>9 A>G5B0=8O @07=KE B8?>2 A>1KB89. "0:, 4;O A>:5B>2 TCP <>6=> C:07K20BL ?@>25@:C ?>ABC?;5=8O 2=5?>;>A=KE 40==KE, 4;O CAB@>9AB2 STREAMS  ?@>25@:C ?>ABC?;5=8O ?@8>@8B5B=KE 40==KE 8 B.4.  revents CAB0=02;820NBAO 18BK, A>>B25BAB2CNI85 @50;L=> ?@>8AH54H5<C A>1KB8N, B.5. 5A;8 2K 70:07K20;8 >6840=85 POLLIN, =5 >1O70B5;L=> 2 revents 1C4CB CAB0=>2;5=K 2A5 18BK, 2E>4OI85 2 <0A:C POLLIN. -B> =5>1E>48<> 8<5BL 2 284C ?@8 ?@>25@:5 revents (A<. ?@8<5@ 2). @><5 POLLIN 8 POLLOUT, 2 revents B0:65 <>3CB ?>O2;OBLAO 18BK POLLERR, POLLHUP 8 POLLNVAL.  events MB8 18BK 83=>@8@CNBAO, 0 2 revents <>3CB 1KBL CAB0=>2;5=K ?@8 A;54CNI8E CA;>28OE: POLLERR  =0 CAB@>9AB25 2>7=8:;0 >H81:0 POLLHUP  A>:5B, B@C10 8;8 B5@<8=0;L=>5 CAB@>9AB2> 70:@KBK =0 4@C3>< :>=F5 POLLNVAL  7=0G5=85 fd =5 A>>B25BAB2C5B 20;84=><C D09;>2><C 45A:@8?B>@C (A:>@55 2A53>, 45A:@8?B>@ 1K; 70:@KB =0 =0H5< :>=F5). @8<5@ 2. A?>;L7>20=85 poll(2) (D@03<5=B ?@>3@0<<K) #include<poll.h> structpollfdfds[3]; intifd1,ifd2,ofd,count; fds[0].fd=ifd1; fds[0].events=POLLNORM; fds[1].fd=ifd2; fds[1].events=POLLNORM; fds[2].fd=ofd; fds[2].events=POLLOUT; count=poll(fds,3,10000); if(count==-1){ perror("pollfailed"); exit(1); } if(count==0) printf("Nodataforreadingorwriting\n"); if(fds[0].revents&POLLNORM) printf("Thereisdataforreadingfd%d\n",fds[0].fd); if(fds[1].revents&POLLNORM) printf("Thereisdataforreadingfd%d\n",fds[1].fd); if(fds[2].revents&POLLOUT) printf("Thereisroomtowriteonfd%d\n",fds[2].fd); @58<CI5AB20 poll(2) ?5@54 select(3C) 4>AB0B>G=> >G5284=K: 8=B5@D59A poll =5 =0:;04K205B >3@0=8G5=89 =0 ?@>AB@0=AB2> =><5@>2 45A:@8?B>@>2, 2> 2AO:>< A;CG05 ?>:0 MB8 =><5@0 2E>4OB 2 480?07>= ?@54AB02;5=8O int. ?@8 1>;LH>< ?@>AB@0=AB25 =><5@>2 45A:@8?B>@>2 (65536 2 40==>< :>=B5:AB5 A;54C5B AG8B0BL 1>;LH8< ?@>AB@0=AB2><), poll G0AB> B@51C5B ?5@540G8 <564C ?>;L7>20B5;LA:8< ?@>F5AA>< 8 O4@>< <5=LH53> >1J5<0 40==KE, G5< select. poll A>>1I05B 1>;LH5 8=D>@<0F88 > ?@>8AH54H8E A 45A:@8?B>@>< A>1KB8OE, G5< <>65B A>>1I8BL select # poll 2E>4=K5 8 2KE>4=K5 7=0G5=8O @07=5A5=K ?> @07=K< ?>;O< AB@C:BC@K, B0: GB> =5 B@51C5BAO ?>;=>ABLN ?5@5A>74020BL <0AA82 fds ?>A;5 :064>3> 2K7>20. @8 8A?>;L7>20=88 poll(2) 2 <=>3>?>B>G=>9 ?@>3@0<<5 ?@8;>68<K B5 65 A>>1@065=8O, :>B>@K5 2KA:07K20;8AL 2 :>=F5 ?@54K4CI53> @0745;0. A?>;L7>20=85 /dev/poll A?>;L7>20=85 poll(2) A 1>;LH8< :>;8G5AB2>< D09;>2KE 45A:@8?B>@>2 ?@82>48B : ?5@540G5 1>;LH8E >1J5<>2 40==KE <564C ?>;L7>20B5;LA:8< ?@>F5AA>< 8 O4@><. @8 MB><, A:>@55 2A53>, 1>;LH0O G0ABL MB8E 40==KE ?5@5405BAO 2?CABCN  254L 5A;8 ?@>F5AA 459AB28B5;L=> <>65B @01>B0BL A B0:8< 1>;LH8< G8A;>< 45A:@8?B>@>2, MB>, A:>@55 2A53>, >7=0G05B, GB> 1>;LH8=AB2> 87 =8E =5 3>B>2K : @01>B5.  Solaris ?@54>AB02;O5BAO =5AB0=40@B=K9 API, :>B>@K9 <>65B 8A?>;L7>20BLAO 4;O @5H5=8O MB>9 ?@>1;5<K. -B>B API >?8AK205BAO =0 AB@0=8F5 A8AB5<=>3> @C:>2>4AB20 poll(7D) 8 A>AB>8B 2 8A?>;L7>20=88 A?5F80;L=>3> ?A524>CAB@>9AB20 /dev/poll. -B> CAB@>9AB2> >B:@K205BAO :0: >1KG=K9 D09; A8AB5<=K< 2K7>2>< open(2). 0B5< 2 =53> A;54C5B 70?8A0BL >4=C 8;8 =5A:>;L:> AB@C:BC@ pollfd (B.5. B5E 65 A0<KE AB@C:BC@, :>B>@K5 8A?>;L7C5B poll(2)). 0?8AL >ACI5AB2;O5BAO A8AB5<=K< 2K7>2>< write(2) 8 <>65B >ACI5AB2;OBLAO 2 =5A:>;L:> ?@85<>2. @8 MB><, 5A;8 2K =5A:>;L:> @07 70?8AK205B5 AB@C:BC@K, A>>B25BAB2CNI85 >4=><C 8 B><C 65 45A:@8?B>@C, A @07=K<8 7=0G5=8O<8 ?>;O events, MB> 1C45B >7=0G0BL @0AH8@5=85 A?8A:0 >?@0H8205<KE A>1KB89 4;O 20H53> 45A:@8?B>@0. ".5. 5A;8 2K A=0G0;0 70?8H5B5 pollfd A events==POLLIN, 0 70B5< A events==POLLOUT, 45A:@8?B>@ 1C45B >?@0H820BLAO 2 @568<5 POLLIN | POLLOUT. A;8 2K E>B8B5 8A:;NG8BL 45A:@8?B>@ 87 <=>65AB20 >?@0H8205<KE, 20< A;54C5B 70?8A0BL AB@C:BC@C pollfd, 2 :>B>@>9 ?>;5 events A>45@68B 18B POLLREMOVE. =>3>:@0B=>5 >B:@KB85 /dev/poll >4=8< ?@>F5AA>< ?@82>48B : A>740=8N =5A:>;L:8E =57028A8<KE =01>@>2 45A:@8?B>@>2. !0< >?@>A >ACI5AB2;O5BAO 2K7>2>< ioctl(2) A :><0=4>9 DP_POLL. -B>B ioctl 8A?>;L7C5B 2 :0G5AB25 ?0@0<5B@0 7=0G5=85 struct dvpoll *. "8? struct dvpoll >?8A0= 2 <sys/devpoll.h> 8 A>45@68B A;54CNI85 ?>;O: struct pollfd* dp_fds  C:070B5;L =0 <0AA82, 2 :>B>@K9 A;54C5B ?>;>68BL >?8A0B5;8 45A:@8?B>@>2, A :>B>@K< A2O70=K A>1KB8O int dp_nfds  @07<5@ <0AA820 dp_fds. "0:65, <0:A8<0;L=>5 :>;8G5AB2> >?8A0B5;59 45A:@8?B>@>2, :>B>@K5 A;54C5B ?>;CG8BL int dp_timeout  B09<-0CB 2 <8;;8A5:C=40E. -B>B ?0@0<5B@ A>>B25BAB2C5B ?0@0<5B@C timeout poll(2). Ioctl DP_POLL 2>72@0I05B :>;8G5AB2> >?8A0B5;59 D09;>2KE 45A:@8?B>@>2, 70?8A0==KE 2 dp_fds, 0 5A;8 ioctl 1K; @071;>:8@>20= ?> B09<-0CBC 8 -1 2 A;CG05 >H81:8. A=>2=>5 >B;8G85 MB>3> API >B poll(2) A>AB>8B 2 B><, GB> ?@8 8A?>;L7>20=88 poll(2) >?8A0B5;8 45A:@8?B>@>2 ?>A;5 >?@>A0 @0A?>;>65=K =0 B5E 65 <5AB0E 2 <0AA825, =0 :>B>@KE 2K A0<8 8E @07<5AB8;8. 0?@>B82, ioctl DP_POLL 2>72@0I05B 20< <0AA82, :>B>@K9 2:;NG05B B>;L:> B5 45A:@8?B>@K, A :>B>@K<8 A2O70=K A>1KB8O, ?@8G5< MB8 45A:@8?B>@K ;560B 2 <0AA825 2 B>< ?>@O4:5, 2 :>B>@>< 8E AG5; C4>1=K< @07<5AB8BL 4@0925@ /dev/poll. ".5. 2K 4>;6=K ?@>c<0B@820BL dp_fds 2 ?>@O4:5 C25;8G5=8O 8=45:A0, 8A?>;L7CO 70B5< 7=0G5=85 ?>;O fd :0: :;NG ?>8A:0. !:>@55 2A53>, 20< ?@845BAO 7025AB8 <0AA82 (2>7<>6=>, 0AA>F80B82=K9), A2O7K20NI89 7=0G5=85 D09;>2>3> 45A:@8?B>@0 A <5B08=D>@<0F859 > B><, GB> MB> 70 45A:@8?B>@ 8 GB> 2K A =8< E>B5;8 45;0BL. @8 @01>B5 A MB8< <0AA82>< 20< A;54C5B 8<5BL 2 284C, GB> Unix ?@8 =>@<0;L=>9 @01>B5 ?5@58A?>;L7C5B =><5@0 D09;>2KE 45A:@8?B>@>2, B.5. 20< =04> >1=>2;OBL 40==K5 2 20H5< <0AA825 :064>< 70:@KB88 D09;0. >@@5:B=0O @50;870F8O 2A59 B@51C5<>9 DC=:F8>=0;L=>AB8 (>A>15==> 2 <=>3>?>B>G=>9 ?@>3@0<<5) B@51C5B 1>;LH>3> >1J5<0 :>40, ?@8G5< :>40, 4>2>;L=> A;>6=>3> ?@8 >B;04:5. !:>@55 2A53>, ?>MB><C poll(7D) =5 AB0; =8 N@848G5A:8< AB0=40@B><, =8 4065 AB0=40@B>< 45-D0:B>. >;LH8=AB2> A>2@5<5==KE Unix-A8AB5<, 70 8A:;NG5=85< Solaris, =5 ?>445@6820NB /dev/poll 8 =5 8<5NB ?;0=>2 @50;870F88 B0:>9 ?>445@6:8 2 >1>7@8<>< 1C4CI5<. 4=0:> A B>G:8 7@5=8O ?@>872>48B5;L=>AB8 poll(7D) 405B >ICB8<K5 ?@58<CI5AB20 4065 ?@8 2?>;=5 @50;8AB8G=KE :>;8G5AB20E D09;>2KE 45A:@8?B>@>2 =0 ?@>F5AA. > 40==K< 87<5@5=89, >?C1;8:>20==KE =0 A09B5  HYPERLINK "http://developers.sun.com/solaris/articles/polling_efficient.html" http://developers.sun.com/solaris/articles/polling_efficient.html, ?@8 4000 BKAOG0E D09;>2KE 45A:@8?B>@>2, poll(7D) B@51C5B 2 16 @07 <5=LH5 ?@>F5AA>@=>3> 2@5<5=8 =0 8A?>;=5=85 7040==>3> :>;8G5AB20 F8:;>2 >?@>A0-GB5=8O-70?8A8, G5< poll(2)! oooHpPpRppprppDrPrRr`rdrssssssss"t.t2t4t:tuu uJuVuXudufuluvuuuuv$v&v(v*v2v4v6v8vxv~vvvvvvvvvwwwww*x2x:xž hjhjhjmH sH  hwhw hwh hwhgt hhoY hhhmH sH hhw hoYhwhwmH sH C>ssJuvv*xVzz^{{|\}~(x vx,gdSgdC^gdYagdYagdj^gdgdgd:xTy\ydyy zHzTzVzjzvzxzzzzzzz^{h{j{v{|{{{{{{{{{ | |||*|.|@|B|D|F|J|N|||||||||}}}}}f}r}t}x}}}~~~~ǿǿǿǿǿǿǴhSmH sH  hShShS hChChCmH sH hChw hYahYahYamH sH hYahjhjmH sH  hjhjhjmH sH hjA~~~~~$(lz~6DFHJʂ̂&28ăƃ҃ԃփ؃6DHVX\lrvȄʄ(6<x6:<<DNvxhSOJQJ^JhShC hShChSmH sH  hShSPxЌ،*,@HJPfNTX8@BLN ʐ̐Аؐڐđʑ̑$,0LT\$&*8:v|bjnŽŽɮɮɮɧɮɮɮɮ h@Th@Th@TmH sH  hhhmH sH hh@ThYa hjhjhjmH sH hjhShSmH sH  hShSOJQJ^JmH sH @,X ̐0&2Rȫgd/Ugd` ^gd` gd@Tgd@T & Fgdjnprv~ lt~ҙܙ<HLr.:<@LP\`t"hĝНԝ.02^`fhprV`hüüh/UmH sH  h/Uh/Uh/U h;Lh;Lh;Lh` mH sH h` h` h` h@TmH sH h@T h@Th@Th;LmH sH Gh~&24@BTV\^lnptĠȠ̠ΠԠءܡޡ0>@HR\^bdln  "¤ȤФؤ"*2$h;LmH sH h;L h;Lh;L h` h` h` mH sH h` V$.046>@DPħƧΧҧ lx6ƫȫ0>FJLP :HJlntv~V^bdh̰ΰ԰ְܰްh/Uh/UmH sH jh/UUmH sH hh/UmH sH  h/Uh/Uh/Uh;L h;Lh;Lh;LmH sH K"$,024<BVX^`fhvx 46βܲ úúúúúúúúж h;Lh;L hh/UhhmH sH h/UmH sH  hhh/Uh h/U0Jh h/U0JmH sH jh/UUmH sH #jh h/UUmH sH  h/Uh/Uh/Uh/UmH sH ,,1h. A!"R#n$n% }DyK Bhttp://developers.sun.com/solaris/articles/polling_efficient.htmlyK http://developers.sun.com/solaris/articles/polling_efficient.htmlB@B 1KG=K9CJ_HaJmHsHtH^@^ bL 03>;>2>: 1$<@&5CJ KH OJQJ\^JaJ `@` bL 03>;>2>: 2$<@& 56CJOJQJ\]^JaJBA@B A=>2=>9 H@8DB 0170F0Xi@X 1KG=0O B01;8F04 l4a .k@. 5B A?8A:0:U@: /U 8?5@AAK;:0 >*B*ph`KEc%<Qd' A h*{.^pduv  P i +!c!!!!!!"4"F"t""""""""#+%k%%%&\&&((!)`)))P*r++x,,--.%///00:13g444X5555-8.8i8899::S;k;<=W@@]A(BBC|CDG\HUI]K^K_KbK00 0 0 0 000%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0% 0% 0% 0% 0% 0% 0%0% 0% 0% 0% 0% 0% 0%0%00r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+0r+ 0r+ 0r+ 0r+ 0r+0000000000000000000Ec%<Qd' A h*{.^pduv  P i +!c!!!!!!"4"F"t""""""""#+%k%%%&\&&((!)`)))X555-8]A(BBCDG\HUI]KbK00 0 0 0 000%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0%0% 0% 0% 0% 0% 0% 0%0% 0% 0% 0% 0 % 0 %j0K0LԳh0K0j000j000j0O0PPh0O0@0 0b0ST`0S0`0S0b0S0@0 0!*4@ Qo:x~xnh$*-./014Z\]^`abct?J>s,+23[_,JlJJ`KX8@0(  B S  ?bcd䦗e\ f$' g hlGit j$klTmd$ noD?p qTrT s t?uj ,>X k HMO###N$+P8bK     .@Z m JOQ###P$+R8bK C*urn:schemas-microsoft-com:office:smarttagsmetricconverter 4 3C ProductID I K &/ir.0"$Y[IK.06=MR&+bi^del]`ns{  & . < B C E I M Y _ b f y  !!!!!3!;!m!u!w!~!!!!!!!!!!!!! """"%"'"8"@"S"Y"""""""""""""""""P%W%%%&&((F)M)x,~,,,,,,,,,,,----..//%/(/)/+///////H0J0Z0a0002"22213833333047444445 555555555555555555566 66663666:6<6?6B6E6H6l6o6666677772787T7V7^7a7e7g7o7r7v7}777777777777777888"8&8(888::; ;R>X>??@@~AAAAAAAAAAAAB B(B.B/B5B7B9B:B=BBBBBBBBBBBCCCC|CCCCCCCCDDEEEEEEFFDGRGjHqHJJbK ` N O P [ *4hcn.[^dvz   " $ U Y u y /!1!g!k!!!!!" "8"@"J"S"{""""""##''x,~,,,----%/(/////4488 < <= =>>>>@@(B.BBBCC|CDDEEEbK33333333333333333333333333333333333333333c;N*P*--..%/A/55S;j;bKjHqHbK "4Y5;^Nq{^6\Airl 6h ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.^`o(. ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.h ^`hH.h ^`hH.h pLp^p`LhH.h @ @ ^@ `hH.h ^`hH.h L^`LhH.h ^`hH.h ^`hH.h PLP^P`LhH.h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHAir5;^q{^ ")3h"7&"7"7>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdfghijklnopqrstuvwxyz{|}~Root Entry F Data e1TablemCWordDocument.SummaryInformation(DocumentSummaryInformation8CompObjq  F Microsoft Office Word MSWordDocWord.Document.89q