【校招 --阶段二 linux操作系统】高级IO多路转接之poll

为什么要引入poll?因为select有几个缺点首先是一个seletct等待的文件描述符是有上限的,还有每次轮询都要重新设定文件描述符集,所以这才有了poll。poll解决了select等待的文件描述符是没有上限的,poll将文件描述符集的输入和输出做了分离并不用在每次轮询以后重新设定

常用接口

头文件#include
函数原型:
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
参数:
fds:类型为结构体指针结构体数组
【校招 --阶段二 linux操作系统】高级IO多路转接之poll_第1张图片
fd表示要等待的文件描述符
events表示要用户告诉内核要等待的该文件描述符
revent表示内核告诉用户该文件描述符已经就绪(系统设定)

nfds:表示结构数组当中元素的个位
timeout:单位为毫秒,表示隔一段时间等待一次是否有就绪,0表述一非阻塞方式等待,-1表示永久阻塞

返回值:
返回值小于0, 表示出错;
返回值等于0, 表示poll函数等待超时;
返回值大于0, 表示poll由于监听的文件描述符就绪而返回.

events和revents的取值:
【校招 --阶段二 linux操作系统】高级IO多路转接之poll_第2张图片
如果想让events一次解决多个事件怎么办?
因为evernts是一个short类型这些事件对应得就是宏就是一个固定的数值,我们也可以设置一个宏代表一个事件
【校招 --阶段二 linux操作系统】高级IO多路转接之poll_第3张图片

每一个事件都只能占据events一个比特位

【校招 --阶段二 linux操作系统】高级IO多路转接之poll_第4张图片
这是源码中对应时间的定义

poll检测标准输入程序

#include
#include
#include
using namespace std;
int main(){
  struct pollfd rnfds[1];
  rnfds[0].fd=0;//stdin'输入
  rnfds[0].events =POLLIN;
  rnfds[0].revents=0;
  while(1){
    switch(poll(rnfds,1,5000)){
      case 0:
        cout<<"等待时间超时"<<endl;
        break;
        case -1:
        cout<<"等待出错"<<endl;
        default:
        if(rnfds[0].fd==0&&(rnfds[0].revents&POLLIN)){
        char buff[1024];
        int s=read(0,buff,sizeof(buff));
        if(s>0){
          buff[s]=0;
          cout<<"stdin:"<<buff<<endl;
        }
        cout<<"等待成功"<<endl;
        break;
    }
  
    }   
  }

  return 0;
}

【校招 --阶段二 linux操作系统】高级IO多路转接之poll_第5张图片
当stdin缓冲区中没有数据时检测不到数据就会检测超时,就会输出等待时间超时,当stdin输入数据时就会检测缓冲区到数据读时间就徐,read就会从内核缓冲区读取数据然后输出。

你可能感兴趣的:(校招,linux,linux,c++,运维,POLL,高级IO)