poll 机制

poll 机制

  • 一、poll机制概述
  • 二、使用流程
  • 三、编程
    • 3.1 驱动编程
    • 3.1 应用编程
  • 四、POLL 机制的内核代码详解
  • 五、编译后上机实验

poll 机制与休眠唤醒机制的区别:
休眠唤醒方式时,进程如果没有得到唤醒信号,需要一直休眠,进程就干不了其他事情了,但是使用poll机制时,可以设置一个超时时间,在超时时间内休眠,超时后可以去干别的。简单说:
应用程序必须要等待某个时间发生:用休眠唤醒机制。
应用程序可以在设定的时间内等待某时间发生,超时后还得去干别的。

一、poll机制概述

① APP不知道是否有事件发生,调用poll函数并传入超时时间。此时线程先放入队列。
② APP进入内核态,如果有事件发生,则poll立即返回。线程也出队列,APP被唤醒。
③ 如果没数据,就休眠一段时间。
④ 如果在休眠期间,有中断被调用,唤醒了队列中的线程,APP被唤醒。
⑤ 当超时时间到了之后,内核也会唤醒 APP。
⑥ APP根据函数的返回值就知道是否有数据,如果有数据就调用read读数据。

二、使用流程

在这里插入图片描述
主要的流程在图中展示的很清楚,注意几点:
① 驱动中的drv_poll把线程挂入队列,但并不在drv_poll中休眠,休眠的过程是在内核文件系统中完成的。
② drv_poll要返回数据状态,因为驱动工程师给我们简化了好多事儿,所以我们写这个函数要遵守一定规则,返回的状态必须是指定好的几个,其中常用的有:
POLLIN :有数据可读
POLLOUT:可以写数据了
③ APP 调用一次 poll,有可能会导致 drv_poll 被调用 2 次
④ 线程被唤醒的原因有 2:中断发生了去队列 wq 中把它唤醒,超时时间到了内核把它唤醒
⑤ APP要判断poll返回的原因,有数据还是超时,并分别处理。

三、编程

3.1 驱动编程

驱动程序中实现file_operation结构体中的poll接口函数实现例子如下:
在这里插入图片描述
其中poll要做两件事:
① 把当前线程挂入队列 wq,用内核的函数poll_wait
② APP 调用 poll 函数时,有可能是查询“有没有数据可以读” :POLLIN,也有可能是查询“你有没有空间给我写数据” :POLLOUT。
POLLRDNORM 等同于 POLLIN,为了兼容某些 APP 把它们一起返回。
POLLWRNORM 等同于 POLLIN,为了兼容某些 APP 把它们一起返回。

3.1 应用编程

注意:APP 可以调用 poll 或 select 函数,这 2 个函数的作用是一样的。
可以监测多个文件,监测多种事件,常用的就POLLIN,POLLIN。
在这里插入图片描述
poll函数简要说明:
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
参数fds 要传入一个结构体数组,数组用于存储要监测的文件句柄(可多个)、指定的捕获类型,返回的捕获类型。
参数nfds指明fds 中有多少个文件句柄啊。
参数timeout为超时时间,单位为ms。

应用程序部分代码如下:

	fds[0].fd = fd;fds[0].events = POLLIN; //看有没有数据可读nfds = 1; //fds.fd 这个文件存放文件句柄的数组中有几个要监控timeout = 5000; //单位为mswhile (1){ret = poll(fds, nfds, timeout);if (1 == ret  && (fds[0].revents & POLLIN)) //poll返回了 且 得是有数据可读{read(fd, &val, 4); /* 3. 读文件 */printf("get button : 0x%x\n", val);} else if (0 == ret){printf("time out !!! \n");}}

四、POLL 机制的内核代码详解

待补充,,,

五、编译后上机实验

注:提前修改设备树,支持pinctrl子系统,gpio子系统,在设备树中添加节点并指定中断信息。
在这里插入图片描述
**下图为在超时时间内按下按键:**按下一次按键后,驱动中dev_poll被调用了两次。
在这里插入图片描述
**下图为等待poll超时:**可见ev_poll被调用了两次。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费思维13招之七:空间型思维

免费思维13招之七:空间型思维 本篇给你带来的是空间型思维。 空间型思维,具体分为内部空间型思维和外部空间型思维。 什么叫内部空间型思维呢? 内部空间型就是充分利用现有空间或资源为社会提供免费服务,积累人气,增加流量,从而带动消费。 为什么你生意不好?为什么你…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时,格式不一样 比如 当右键单击时,然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪,就pdf的格式比较靠谱一点

2024年建筑施工特种作业人员安全生产知识试题

100分题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 单选题(1-10) 1.因生产安全事故受损害的从业人员,除…

Busybox 在 Docker 中的部署和启动

可以使用 docker pull 指令下载 busybox:latest 镜像: PS C:\Users\yhu> docker pull busybox:latest latest: Pulling from library/busybox ec562eabd705: Pull complete Digest: sha256:5eef5ed34e1e1ff0a4ae850395cbf665c4de6b4b83a32a0bc7bcb998e24e7bbb St…

ElasticSearch集群环境

ElasticSearch集群环境 1、Linux单机 下载地址:LINUX X86_64 (elastic.co) 下载之后进行解压 tar -zxf elasticsearch-7.8.0-linux-x86_64.tar.gz 名字太长了改个名字改成es mv elasticsearch-7.8.0 es因为安全问题,Elasticsearch 不允许 root 用户…

性能优化 | el-table中内嵌大量el-input控件导致渲染卡顿的问题

场景 项目中有一个应用场景,用户需要在表单中大量使用选择框以及输入框填写数据(每一行大概有三十几个输入框),当选择框与输入框达到一定数量的时候,页面会出现输入不连续、卡顿的现象,如下图:…

C++基础与深度解析 | 什么是C++ | C++开发环境与相关工具 | C++编译/链接模型

文章目录 一、什么是C二、C的开发环境与相关工具三、C的编译/链接模型 一、什么是C C是一门比较流行的编程语言(高级语言),同时也是一门复杂的语言。从TIOBE 编程社区指数中可以看出:在2024.04中,其编程语言受欢迎程度…

HCIP【BGP综合实验】

目录 一、实验拓扑图: 二、实验要求: 三、实验思路: 四、实验步骤: 1、进行网段的子网划分(整个实验总共有19条网段): (1)首先,根据实验要求,将172.16.0.0/16全部划…

2024湖南理工学院程序设计竞赛(同步赛) G. 区间递减(思维题 分类讨论 ST表)

题目 https://ac.nowcoder.com/acm/contest/82672/G 思路来源 出题人 涼風青葉7代码 题解 注意到三种情况即可, 第一种情况,10 9 8 1 2,保留1 第二种情况,6 5 10 9 4 4,保留5 4 4 第三种情况,6 5 4&…

jdk8的新特征

1: jdk8中新增的方法 在jdk8中对接口进行了增强,在jdk8之前 interface 接口名{ 静态常量: 抽象方法: } 在jdk8之后 interface 接口名{ 静态常量: 抽象方法: 默认方法: 静态方法: } 2…

JAVA基础--IO

IO 什么是IO 任何事物提到分类都必须有一个分类的标准,例如人,按照肤色可分为:黄的,白的,黑的;按照性别可分为:男,女,人妖。IO流的常见分类标准是按照*流动方向*和*操作…

Google与哈佛大学的科学家团队共同创造了一张人脑中一个极小部分的精细地图

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

插件:Best HTTP

一、简介 WebSocket WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。…

【SRC实战】无法支付的修改金额支付漏洞

挖个洞先 https://mp.weixin.qq.com/s/F4f8R4uKN0Q9BnTmjDMleg “ 以下漏洞均为实验靶场,如有雷同,纯属巧合 ” 01 — 漏洞证明 一、企业用户,标准商品 “ 支付订单需要公对公银行卡转账,如何绕过?” 1、点击任意…

java入门-面向对象的三大特性

面向对象三大特性 封装 什么是封装 封装 是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。 封装的作用 访问控制符 方法传参-值传递 传参类型是基本类型 程序案例: public static void main(St…

C++笔记(体系结构与内核分析)

1.OOP面向对象编程 vs. GP泛型编程 OOP将data和method放在一起,目的是通过封装、继承、多态提高软件的可维护性和可扩展性GP将data和method分开,可以将任何容器与任何算法结合使用,只要容器满足塞饭所需的迭代器类型 2.算法与仿函数的区别 …

AJAX前端与后端交互技术知识点以及案例

Promise promise对象用于表示一个异步操作的最终完成(或失败)及其结果值 好处: 逻辑更清晰了解axios函数内部运作机制成功和失败状态,可以关联对应处理程序能解决回调函数地狱问题 /*** 目标:使用Promise管理异步任…

Linux-02

Linux常用命令: ls: 列出目录touch: 创建文件 touch test.txt echo:往文件写内容echo "i love linux" >>test.txtcd:切换目录pwd:显示目前的目录mkdir:创建一个新的目录 mkdir dai:创建目录dai mkdir -p test1/t…

基于springboot的物业服务平台的设计与实现

基于springboot的物业服务平台的设计与实现 摘 要:本文针对社区物业服务管理现状,采用B/S系统架构并选择MySQL数据库作为系统的数据存储系统,设计并实现一个以Spring Boot为后端框架、Vue为前端框架的社区物业服务管理平台。与传统的物业服务管理方式相比,该系统取代了传统…

如何查看打包后的jar包启动方法main方法

背景 有时候我们在引用一个jar包的时候,想查看一个jar包的结构,这时候查看启动类就比较重要,因为一些关键配置是在启动类上的,这里教大家如何查看这个启动类(springboot项目) 步骤 首先打开jar包预览结构,可以使用解压缩工具直接双击打开或者预览结构 打开路径 META-INF/MA…