I/O多路复用中select指的是什么
发布时间 - 2023-05-13 00:00:00 点击率:次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 hello echo: hello hi echo: hi nihao echo: nihao ahhau echo: ahhau quit [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) 124124 { 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 else 135 { 136 buf[size]='\0'; 137 } 138 printf("client:%s\n",buf); 139 } 140 else 141 {} 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 8080 timeout... client:hello client:hi client:huowo client close... client: read: Bad file descriptor [fbl@localhost select_socket]$ [fbl@localhost select_socket]$ ./client 192.168.1.106 8080 please say:hello client : hello please say:hi client : hi please say:huowo client : huowo please say:^C [fbl@localhost select_socket]$
# 多个
# 遍历
# 几大
# 拷贝到
# 太小了
# exit
# size
# continue
# strncmp
# quit
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
太平洋网站制作公司,网络用语太平洋是什么意思?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
如何在腾讯云免费申请建站?
大连网站制作公司哪家好一点,大连买房网站哪个好?
Bootstrap整体框架之CSS12栅格系统
如何利用DOS批处理实现定时关机操作详解
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
如何获取上海专业网站定制建站电话?
如何快速查询网站的真实建站时间?
HTML 中如何正确使用模板变量为元素的 name 属性赋值
Python数据仓库与ETL构建实战_Airflow调度流程详解
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Android GridView 滑动条设置一直显示状态(推荐)
如何在宝塔面板中创建新站点?
如何快速查询域名建站关键信息?
如何在万网自助建站平台快速创建网站?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
iOS验证手机号的正则表达式
HTML 中动态设置元素 name 属性的正确语法详解
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何在IIS7中新建站点?详细步骤解析
Laravel如何使用查询构建器?(Query Builder高级用法)
Laravel如何实现数据库事务?(DB Facade示例)
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
实现点击下箭头变上箭头来回切换的两种方法【推荐】
如何快速搭建安全的FTP站点?
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
如何挑选优质建站一级代理提升网站排名?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
制作旅游网站html,怎样注册旅游网站?
如何登录建站主机?访问步骤全解析
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Android使用GridView实现日历的简单功能
重庆市网站制作公司,重庆招聘网站哪个好?
Laravel如何升级到最新版本?(升级指南和步骤)
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)


ssize_t size = read(new_sock,buf,sizeof(buf)-1);
123 if(size<0)
124124 {
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 else
135 {
136 buf[size]='\0';
137 }
138 printf("client:%s\n",buf);
139 }
140 else
141 {}
142 }
143
144 break;
145 }
146
147 }
148 }
149 return 0;
150 }
1 #include