栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

常用接口

头文件#include
函数原型:
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
参数:
fds:类型为结构体指针结构体数组

fd表示要等待的文件描述符
events表示要用户告诉内核要等待的该文件描述符
revent表示内核告诉用户该文件描述符已经就绪(系统设定)

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

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

events和revents的取值:

如果想让events一次解决多个事件怎么办?
因为evernts是一个short类型这些事件对应得就是宏就是一个固定的数值,我们也可以设置一个宏代表一个事件

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


这是源码中对应时间的定义

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<<"等待时间超时"<0){
          buff[s]=0;
          cout<<"stdin:"< 


当stdin缓冲区中没有数据时检测不到数据就会检测超时,就会输出等待时间超时,当stdin输入数据时就会检测缓冲区到数据读时间就徐,read就会从内核缓冲区读取数据然后输出。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768587.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号