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 #include
  2 #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 #include
  2 #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(;i0)
 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;i0 && 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组件介绍之一)