select是用于监视多个文件描述符状态的变化的。即用来监视文件描述符读/写/异常状态是否就绪。
函数原型:int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);
select的几大缺点:
(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
(3)select支持的文件描述符数量太小了
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<unistd.h> 5 #include<sys> 6 7 int main() 8 { 9 int std_in = 0; 10 // int std_out = 1; 11 fd_set reads; 12 // fd_set writes; 13 //int max_nums = std_out; 14 int max_nums = std_in; 15 FD_ZERO(&reads); 16 // FD_ZERO(&writes); 17 FD_SET(std_in,&reads); 18 // FD_SET(std_out,&writes); 19 struct timeval _timeout = {5,0}; 20 int done = 0; 21 while(!done) 22 { 23 _timeout.tv_sec = 5; 24 _timeout.tv_usec = 0; 25 //switch(select(max_nums+1,&reads,&writes,NULL,&_timeout)) 26 switch(select(max_nums+1,&reads,NULL,NULL,&_timeout)) 27 { 28 case -1: 29 perror("select"); 30 break; 31 case 0: 32 printf("timeout...n"); 33 break; 34 default://success 35 { 36 if(FD_ISSET(std_in,&reads)) 37 {//read 38 char buf[1024]; 39 memset(buf,' ',sizeof(buf)); 40 ssize_t size = read(std_in,buf,sizeof(buf)-1); 41 if(size<pre class="brush:cpp;toolbar:false"> 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<unistd.h> 5 #include<sys> 6 #include<sys> 7 #include<sys> 8 #include<netinet> 9 #include<arpa> 10 #include<assert.h> 11 12 #define _BACKLOG_ 5 13 int fd[64]; 14 void usage(char *_port) 15 { 16 printf("%s,[ip],[port]n",_port); 17 } 18 int startup(char *ip,int port) 19 { 20 assert(ip); 21 int sock = socket(AF_INET,SOCK_STREAM,0); 22 if(sock0) 79 { 80 FD_SET(fd[i],&reads); 81 if(fd[i]>max_nums) 82 { 83 max_nums = fd[i]; 84 } 85 86 } 87 } 88 switch(select(max_nums+1,&reads,&writes,NULL,&_timeout)) 89 { 90 case -1: 91 perror("select"); 92 break; 93 case 0: 94 printf("timeout...n"); 95 break; 96 default: 97 { 98 99 for(i=0;i<fd_nums>0 && FD_ISSET(fd[i],&reads)) 119 { 120 char buf[1024]; 121 memset(buf,' ',sizeof(buf)); 122 ssize_t size = read(new_sock,buf,sizeof(buf)-1); 123 if(size 2 #include<string.h> 3 #include<stdlib.h> 4 #include<unistd.h> 5 #include<sys> 6 #include<sys> 7 #include<sys> 8 #include<netinet> 9 #include<arpa> 10 void usage(char *_port) 11 { 12 printf("%s,[ip],[port]n",_port); 13 } 14 int main(int argc,char *argv[]) 15 { 16 if(argc!=3) 17 { 18 usage(argv[0]); 19 return 1; 20 } 21 int port = atoi(argv[2]); 22 char *ip = argv[1]; 23 int sock = socket(AF_INET,SOCK_STREAM,0); 24 if(sock</arpa></netinet></sys></sys></sys></unistd.h></stdlib.h></string.h></fd_nums></assert.h></arpa></netinet></sys></sys></sys></unistd.h></stdlib.h></string.h></stdio.h>
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END