首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >嵌入式Linux的POLL/SELECT 方式

嵌入式Linux的POLL/SELECT 方式

作者头像
韦东山
发布2022-05-05 15:55:28
发布2022-05-05 15:55:28
3.4K0
举报
文章被收录于专栏:韦东山嵌入式韦东山嵌入式

7.3.6 POLL/SELECT 方式

  1. 功能介绍 POLL 机制、SELECT 机制是完全一样的,只是 APP 接口函数不一样。

简单地说,它们就是“定个闹钟”:在调用 poll、select 函数时可以传入“超时时间”。在这段时间内,条件合适时(比如有数据可读、有空间可写)就会立刻返回,否则等到“超时时间”结束时返回错误。

用法如下。

APP 先调用 open 函数时。

APP 不是直接调用 read 函数,而是先调用 poll 或 select 函数,这 2 个函数中可以传入“超时时间”。它们的作用是:如果驱动程序中有数据,则立刻返回;否则就休眠。在休眠期间,如果有人操作了硬件,驱动程序获得数据后就会把 APP 唤醒,导致 poll 或 select 立刻返回;如果在“超时时间”内无人操作硬件,则时间到后 poll 或 select 函数也会返回。APP 可以根据函数的返回值判断返回原因:有数据?无数据超时返回?

APP 根据 poll 或 select 的返回值判断有数据之后,就调用 read 函数读取数据时,这时就会立刻获得数据。poll/select 函数可以监测多个文件,可以监测多种事件:

事件类型

说明

POLLIN

有数据可读

POLLRDNORM

等同于 POLLIN

POLLRDBAND

Priority band data can be read,有优先级较较高的“band data”可读Linux 系统中很少使用这个事件

POLLPRI

高优先级数据可读

POLLOUT

可以写数据

POLLWRNORM

等同于 POLLOUT

POLLWRBAND

Priority data may be written

POLLERR

发生了错误

POLLHUP

挂起

POLLNVAL

无效的请求,一般是 fd 未 open

在调用 poll 函数时,要指明: ① 你要监测哪一个文件:哪一个 fd ② 你想监测这个文件的哪种事件:是 POLLIN、还是 POLLOUT 最后,在 poll 函数返回时,要判断状态。

应用程序代码如下:

代码语言:javascript
复制
struct pollfd fds[1];
int timeout_ms = 5000;
int ret;
fds[0].fd = fd;
fds[0].events = POLLIN;
ret = poll(fds, 1, timeout_ms);
if ((ret == 1) && (fds[0].revents & POLLIN))
{
read(fd, &val, 4);
printf("get button : 0x%x\n", val);
}
  1. 现在编程:使用 POLL
  2. 课后作业 使用 poll 函数监测多个输入设备。 使用 select 函数实现同样的功能。 (大家可以试一试)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 7.3.6 POLL/SELECT 方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档