Linux I/O多路转接----poll模型

来源:互联网 发布:裤子品牌 知乎 编辑:程序博客网 时间:2024/05/21 22:51

1.poll模型属于I/O多路转接模型,是对select模型的一种优化;

int  poll(struct pollfd *fds,nfd_t  nfds,int timeout);

2.poll的优点:

①poll使用数组存储文件描述符,所以能描述的文件描述个数在理论上没有上限;
 
②poll将输入输出型参数进行了分离,因此使用时不需要重新设置;

 ③不要求计算最大文件描述符加1的值,处理大数目文件描述符时比select的速度快;

3.poll的缺点:

①poll是系统调用,每次都要将文件描述符数字组从用户态拷贝到内核态,开销很大;

 ②虽然poll在理论上对描述的文件描述个数没有上限,但每次调用poll,都要遍历所有的文件描述符,当数量很多时,开销很大,会降低性能和效率;

4.实现一个poll服务器,监控输入:

#include<stdio.h>#include<poll.h>int main(){    struct pollfd evs;    evs.fd=0;    evs.events=POLLIN;//当关心多个事件时,使用|    evs.revents=0;    int timeout=3000;    while(1)    {       switch(poll(&evs,1,timeout))       {          case -1:perror("poll");                  break;          case  0:printf("timeout...\n");                  break;          default:          {//至少有一个数据就绪               char buf[1024];               if(evs.revents & POLLIN)               {                    ssize_t s=read(evs.fd,buf,sizeof(buf)-1);                    if(s>0)                    {//读成功                        buf[s]=0;                        printf("echo#%s\n",buf);//回显                    }               }           }       }  }     return 0;}

结果如图所示: 

  这里写图片描述

原创粉丝点击