I/O多路复用中select指的是什么

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(&amp;reads);  16 //  FD_ZERO(&amp;writes);  17     FD_SET(std_in,&amp;reads);  18 //  FD_SET(std_out,&amp;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,&amp;reads,&amp;writes,NULL,&amp;_timeout))  26         switch(select(max_nums+1,&amp;reads,NULL,NULL,&amp;_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,&amp;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],&amp;reads);  81                 if(fd[i]&gt;max_nums)  82                 {  83                     max_nums = fd[i];  84                 }  85   86             }  87         }  88         switch(select(max_nums+1,&amp;reads,&amp;writes,NULL,&amp;_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 &amp;&amp; FD_ISSET(fd[i],&amp;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
喜欢就支持一下吧
点赞10 分享