锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍒╃敤select鍑芥暟鍙互瀹屾垚闈為樆濉為氫俊錛屽畠鍙互鍦ㄧ敤鎴鋒寚瀹氱殑鏃墮棿鍐呯洃鍚竴浜涘彞鏌勶紙鏂囦歡鎻忚堪絎︼紵錛夛紙涓涓彞鏌勫氨鏄綘緇欎竴涓枃浠訛紝璁懼錛屽鎺ュ瓧(socket)鎴栫閬撶殑涓涓悕瀛? 浠ヤ究甯姪浣犺浣忎綘姝e鐞嗙殑鍚嶅瓧, 騫墮殣钘忔煇浜涚紦瀛樼瓑鐨勫鏉傛с傦級(jí)錛屽綋readfds鎴杦ritefds涓槧璞$殑鏂囦歡鍙鎴栧彲鍐欐垨瓚呮椂錛屾湰嬈elect()灝辯粨鏉熻繑鍥炪傜▼搴忓憳鍒╃敤涓緇勭郴緇熸彁渚涚殑瀹忓湪select()緇撴潫鏃朵究鍙垽鏂摢涓鏂囦歡鍙鎴栧彲鍐欍?/p> 銆?/p> 鍑芥暟鍘熷瀷錛? int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); ndfs錛歴elect鐩戣鐨勬枃浠跺彞鏌勬暟錛岃榪涚▼涓墦寮鐨勬枃浠舵暟鑰屽畾,涓鑸涓轟綘瑕佺洃瑙嗗悇鏂囦歡 涓殑鏈澶ф枃浠跺彿鍔犱竴銆? readfds錛歴elect鐩戣鐨勫彲璇繪枃浠跺彞鏌勯泦鍚堛? writefds: select鐩戣鐨勫彲鍐欐枃浠跺彞鏌勯泦鍚堛? exceptfds錛歴elect鐩戣鐨勫紓甯告枃浠跺彞鏌勯泦鍚堛? timeout錛氭湰嬈elect()鐨勮秴鏃剁粨鏉熸椂闂淬?/p> 鍑芥暟榪斿洖鍊鹼細(xì) 0琛ㄧず瓚呮椂 -1琛ㄧず鍑洪敊 姝f暟琛ㄧず鏂囦歡鍙鎴栧彲鍐?/p> 鐩稿叧鐨勫畯錛?/strong> FD_ZERO(fd_set *fdset)錛氭竻絀篺dset涓庢墍鏈夋枃浠跺彞鏌勭殑鑱旂郴銆? FD_SET(int fd, fd_set *fdset)錛氬緩绔嬫枃浠跺彞鏌刦d涓巉dset鐨勮仈緋匯? FD_CLR(int fd, fd_set *fdset)錛氭竻闄ゆ枃浠跺彞鏌刦d涓巉dset鐨勮仈緋匯? FD_ISSET(int fd, fd_set *fdset)錛氭鏌dset鑱旂郴鐨勬枃浠跺彞鏌刦d鏄惁鍙鍐欙紝褰?gt;0琛ㄧず鍙鍐欍?/p> select鍙兘鐩戝惉鏂囦歡鎻忚堪絎︼紙file descriptors錛夛紝鏂囦歡鎸囬拡鏄笉琛岀殑銆傞氳繃int fileno(FILE* fp)鍑芥暟鍙互瀹屾垚鏂囦歡鎸囬拡鍒版枃浠舵弿榪扮鐨勮漿鎹€?/p> 浠g爜鐗囨錛戯細(xì)鍦ㄦ寚瀹氭椂闂村唴璇誨彇stdin鐨勬暟鎹?/p> 浠g爜鐗囨錛掞細(xì)鏈嶅姟鍣ㄥ湪涓瀹氭椂闂村唴鎺ユ敹瀛愯妭鐐瑰彂鏉ョ殑鏁版嵁鎶ャ?/p>
#include<stdlib.h>
#include<string.h>
#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>
int main(){
int fno = fileno(stdin);
// 寰楀埌sdtin鐨勬枃浠舵弿榪扮
fd_set fdR;
struct timeval timeout = {.tv_sec = 10, .tv_usec = 0};
FD_ZERO(&fdR);
FD_SET(fno, &fdR);
char str[64];
int goOn = 1;
while(goOn){
printf("goOning
\n");
switch(select(fno + 1, &fdR, NULL, NULL, &timeout)){
case -1:
printf("select fail\n");
goOn = 0;
break;
case 0:
printf("select end\n");
goOn = 0;
break;
default:
scanf("%s", str);
printf("str=%s\n", str);
}
}
}
…

…

fd_set fdR;
struct timeval timeout = {tv_sec:10, tv_usec:0};// 絳夊緟鎺ユ敹涓瀹氭椂闂翠箣鍚庣粨鏉?/span>
int goOn = 1;
FD_ZERO(&fdR);
FD_SET(sockfd, &fdR);
while(goOn){
switch(select(sockfd + 1, &fdR, NULL, NULL, &timeout)){
case -1:
printf("select fail\n");
goOn = 0;
break;
case 0:
printf("select timeout\n");
goOn = 0;
break;
default:
// 姝e父鎯呭喌錛岃鍙栦俊鎭?/span>
if((numbytes = recvfrom(sockfd, &cdt, sizeof(cdt), 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1){
printf("recvfrom fail\n");
}
}
鍙傞槄錛?br />http://www.tuicool.com/articles/Rfeaie
]]>