I/O多路复用中select指的是什么
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章跟大家分析一下"I/O多路复用中select指的是什么"。内容详细易懂,对"I/O多路复用中select指的是什么"感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮
千家信息网最后更新 2026年10月31日I/O多路复用中select指的是什么
这篇文章跟大家分析一下"I/O多路复用中select指的是什么"。内容详细易懂,对"I/O多路复用中select指的是什么"感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习"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 #include2 #include 3 #include 4 #include 5 #include 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,'\0',sizeof(buf)); 40 ssize_t size = read(std_in,buf,sizeof(buf)-1); 41 if(size<0) 42 { 43 perror("read"); 44 exit(1); 45 } 46 if(strncmp(buf,"quit",4)==0) 47 { 48 done =1; 49 continue; 50 } 51 printf("echo: %s",buf); 52 53 } 54 // if(FD_ISSET(std_out,&writes)) 55 // {//writes 56 // char buf[1024]; 57 // while(1) 58 // { 59 // memset(buf,'\0',sizeof(buf)); 60 // strcpy(buf,"hello world"); 61 //write(1,buf,sizeof(buf)-1); 62 // printf("%s\n",buf); 63 // } 64 // } 65 break; 66 } 67 } 68 } 69 return 0; 70 } [fbl@localhost select]$ ./select helloecho: hellohiecho: hinihaoecho: nihaoahhauecho: ahhauquit[fbl@localhost select]$
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 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(sock<0) 23 { 24 perror("socket"); 25 exit(1); 26 } 27 struct sockaddr_in local; 28 local.sin_family = AF_INET; 29 local.sin_port = htons(port); 30 local.sin_addr.s_addr = inet_addr(ip); 31 if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0) 32 { 33 perror("bind"); 34 exit(2); 35 } 36 if(listen(sock,_BACKLOG_)<0) 37 { 38 perror("listen"); 39 exit(3); 40 } 41 return sock; 42 43 44 } 45 int main(int argc,char *argv[]) 46 { 47 if(argc!=3) 48 { 49 usage(argv[0]); 50 return 1; 51 } 52 int port = atoi(argv[2]); 53 char *ip = argv[1]; 54 int listen_sock = startup(ip,port); 55 int new_sock = -1; 56 struct sockaddr_in client; 57 socklen_t len = sizeof(client); 58 fd_set reads; 59 fd_set writes; 60 int max_nums; 61 struct timeval _timeout = {5,0}; 62 int done = 0; 63 int i =0; 64 int fd_nums = sizeof(fd)/sizeof(fd[0]); 65 for(;i 0) 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 0 && FD_ISSET(fd[i],&reads))119 {120 char buf[1024];121 memset(buf,'\0',sizeof(buf));122 ssize_t size = read(new_sock,buf,sizeof(buf)-1);123 if(size<0)124 {125 perror("read");126 exit(4);127 }128 else if(size==0)129 {130 printf("client close...\n");131 close(fd[i]);132 fd[i]=-1;133 }134 else135 {136 buf[size]='\0';137 }138 printf("client:%s\n",buf);139 }140 else141 {}142 }143 144 break;145 }146 147 }148 }149 return 0;150 }1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 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<0) 25 { 26 perror("socket"); 27 exit(1); 28 } 29 struct sockaddr_in remote; 30 remote.sin_family = AF_INET; 31 remote.sin_port = htons(port); 32 remote.sin_addr.s_addr = inet_addr(ip); 33 int ret = connect(sock,(struct sockaddr*)&remote,sizeof(remote)); 34 if(ret<0) 35 { 36 perror("connect"); 37 exit(1); 38 } 39 char buf[1024]; 40 while(1) 41 { 42 43 memset(buf,'\0',sizeof(buf)); 44 printf("please say:"); 45 scanf("%s",buf); 46 ssize_t size = write(sock,buf,sizeof(buf)-1); 47 if(size<0) 48 { 49 perror("write"); 50 exit(2); 51 } 52 else if(size ==0) 53 {} 54 else 55 { 56 printf("client : %s\n",buf); 57 } 58 } 59 return 0; 60 }[fbl@localhost select_socket]$ ./server 192.168.1.106 8080timeout...client:helloclient:hiclient:huowoclient close...client:read: Bad file descriptor[fbl@localhost select_socket]$ [fbl@localhost select_socket]$ ./client 192.168.1.106 8080please say:helloclient : helloplease say:hiclient : hiplease say:huowoclient : huowoplease say:^C[fbl@localhost select_socket]$
关于I/O多路复用中select指的是什么就分享到这里啦,希望上述内容能够让大家有所提升。如果想要学习更多知识,请大家多多留意小编的更新。谢谢大家关注一下网站!
多路
复用
文件
很大
内容
内核
开销
状态
知识
跟着
学习
监视
兴趣
函数
原型
同时
多个
思路
拷贝
数量
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技股
互联网科技公司排名
湖南永感互联网科技有限公司
科技互联网项目
科技互联网政务服务
互联网科技开发公司
互联网 科技公司
金融科技 互联网金融
互联网科技网站
互联网科技公司名称
须眉科技是互联网公司吗
剑昆互联网络科技有限公司临桂
重庆互联网医院沙龙医盟信息科技
阿大互联网科技有限公司
深圳互联网科技的发展
北京市互联网新科技
悟空问答互联网科技
互联网对科技影响
长沙易易互联网科技有限公司
伍佰万互联网科技是干嘛的
科技创新与互联网经济
鸠鸠互联网科技
平安科技 互联网
深圳互联网科技怎么样
银川新华互联网科技学校地址
北京大学互联网科技怎么样
苏州五指互联网络科技有限
扫呗互联网科技有限公司
互联网科技和医药行业
互联网科技快速发展优美句子