高级I/O---多路复用---poll
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,稍加改进的多路复用--pollpoll是一个在select上稍加改进的多路复用版本,不久后就被功能完善的epoll所取代,它与select的区别在于select的返回通过输入参数来返回,这样每次都要添
千家信息网最后更新 2026年10月31日高级I/O---多路复用---poll
稍加改进的多路复用--poll
poll是一个在select上稍加改进的多路复用版本,不久后就被功能完善的epoll所取代,它与select的区别在于select的返回通过输入参数来返回,这样每次都要添加要关心的文件描述符到其文件描述符集中,而poll设置了一个结构体指针参数,通过他就可以知道状态变化,但免不了的是依旧需要遍历整个buf,它的大小可以由用户自定义,但是过于大的集合会使得服务器负担大大加重,而太小的集合又因为大多的socket都在等待数据到来,效率上又会下滑很多,所以poll很尴尬。
poll的函数
#includeint poll(struct pollfd *fds, nfds_t nfds, int timeout); struct pollfd { int fd; /* file descriptor */ short events; /* requested events */ short revents; /* returned events */ };
poll的函数与select不一样的地方就是它的fds参数,他是一个结构体指针,结构体的定义就是下面那个
struct pollfd,其中的events是设置的时候所要关心的时间,revents是输出当大于零的时候便说明发生了event所设置的情况,revents不用手动清空,他会自动清空。
因为和select差不多,就直接看代码吧
下面是实现的一个简单的poll版本的tcp服务器
因为前面的设置监听套接字和之前的都一样就忽略了
43 void PollServer(int sock) 44 { 45 int i=0; 46 int max_fd=-1; 47 struct pollfd fds[_MAX_FDS_]; 48 for(;i<_MAX_FDS_;i++) 49 { 50 fds[i].fd=-1; 51 } 52 fds[0].fd=sock; 53 max_fd=sock; 54 fds[0].events=POLLIN; //设置为所关心的事件 55 int timeout; 56 while(1) 57 { 58 int new_sock=-1; 59 60 struct sockaddr_in client; 61 socklen_t client_len=sizeof(client); 62 63 fds[0].fd=sock; 64 fds[0].events=POLLIN; 65 timeout=5000; 66 switch(poll(fds,max_fd+1,timeout))//依然需要循环 67 { 68 case -1: 69 perror("poll"); 70 continue; 71 case 0: 72 printf("timeout\n"); 73 continue; 74 default: 75 { 76 for(i=0;i<_MAX_FDS_;i++) 77 { 78 int fd=fds[i].fd; 79 if(fd==sock&&fds[i].revents>0) //当有新的连接时 80 { 81 new_sock=accept(sock,(struct sockaddr*)\ 82 &client,&client_len); 83 printf("%d\n",new_sock); 84 for(i=0;i<_MAX_FDS_;i++) 85 { 86 if(fds[i].fd<0) 87 { 88 fds[i].fd=new_sock; 89 fds[i].events=POLLIN; 90 break; 91 } 92 } 93 if(i==_MAX_FDS_) 94 { 95 close(new_sock); 96 } 97 } 98 else if(fd>0&&fds[i].revents>0) //当有需要读的数据时 99 {100 char buf[1024];101 memset(buf,'\0',sizeof(buf));102 ssize_t size=read(fd,buf,sizeof(buf)-1);103 if(size>0)104 {105 buf[size]='\0';106 printf("client::%s\n",buf);107 }else if(size==0){108 close(fd);109 fds[i].fd=-1;110 fds[i].events=-1;111 }else{112 perror("read");113 continue;114 }115 }116 }117 }118 }119 }120 }121poll和select的区别并不大,所以很快被epoll淘汰掉了
参数
结构
多路
复用
函数
就是
指针
数据
文件
时候
服务器
版本
服务
尴尬
差不多
不大
不用
事件
代码
功能
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广东万易互联网科技有限公司惠州分公司
科技赋能下的互联网金融
科技与互联网
互联网科技会
期待互联网科技
百单互联网科技有限公司
丰台科技园 互联网
汇久创客互联网科技
佰商互联网科技有限公司
金融科技和互联网金融
汽车互联网创新科技园
彤创互联网科技有限公司
岳阳华臻互联网科技有限公司
互联网公司黑科技创始人
互联网数据科技专业
互联网方面的科技前沿
锡山区互联网智能科技产品供应
万物互联网智能科技
众联互联网络科技
黑龙江互联网科技公司
新华互联网科技学院
迪茉互联网科技
互联网科技缩写
科技类的互联网平台
广州优美互联网科技
深圳国际航运科技和互联网
昭通互联网科技选哪家
元气玛特互联网科技公司是外包吗
互联网公司属于科技吗
互联网高科技绘画