都允许进程决定是否可以对一个或者多个打开的文件做非阻塞的读取或写入。这些调用也会阻塞进程,直到给定的文件描述符集合中的任何一个可读取或写入。常常用于那些要使用多个输入或输出流而又不会阻塞与其中任意一个流的应用程序。

unsigned int (*poll)(struct file *filp,poll_table *wait);

当用户程序使用在驱动程序相关联的文件描述符上执行poll,select,或者epoll系统调用时,该驱动程序方法调用。

分两步:

1.在一个或者多个可指示poll状态变化的等待队列上调用poll_wait。如果当前没有文件描述符可以用来执行IO,则内核将使进程在传递到该系统调用的所有文件描述符对应的等待队列上等待。

2.返回一个用来描述操作是否可以立即无阻塞执行的位掩码。

这些都依赖于驱动程序提供的信息,必须为每一个驱动程序分别实现对应操作。传递给poll方法的第二个参数,poll_table结构,用于在内核中实现poll、select以及epoll调用。它在<linux/poll.h>中声明,驱动程序源代码必须包含这个头文件。驱动程序编写者不需要了解改结构的细节,且需要将其当成一个不透明对象使用。它被传递给驱动程序方法,以使每个可以唤醒进程和修改poll操作状态的等待队列都可以被驱动程序装载。通过poll_wait函数,驱动程序向poll_table结构添加一个等待队列:

void poll_wait(struct file *,wait_queue_head_t *,poll_table *);

poll方法执行的第二项任务是返回描述那个操作可以理解执行的位掩码,这也很直接,例如,如果设备已有数据就绪,一个read操作可以立刻完成而不用休眠,那么poll方法应该指出这种情况。几个标志(在<linux/poll.h>asm/poll.h)用来指明可能的操作。

poll和select的更多相关文章

  1. 【Pyhton Network】使用poll()或select()实现非阻塞传输

    通常情况下,socket上的I/O会阻塞.即除非操作结束,否则程序不会照常进行.而以下集中情况需要在非阻塞模式下进行:1. 网络接口在等待数据时是活动的,可以做出相应:2. 在不使用线程或进程的情况下 ...

  2. poll() 与 select()比较

    比较poll() 与select() 尽管poll()和select()所做的是相同的工作,不过poll()优于select(),原因:    1.poll()不需要用户计算并传递作为参数的最高编号的 ...

  3. linux epoll,poll,select

    epoll函数用法,还有点poll和select 1,LT的epoll是select和poll函数的改进版. 特点是,读完缓冲区后,如果缓冲区还有内容的话,epoll_wait函数还会返回,直到把缓冲 ...

  4. 四、poll()、select()和epoll()

    在用户程序中,poll()和select()系统调用用于对设备进行无阻塞访问.poll()和select()最终会调用设备驱动中的poll()函数,在我所使用的Linux内核中,还有扩展的poll() ...

  5. poll 和 select 底层的数据结构

    poll 和 select 系统调用的真正实现是相当地简单, 对那些感兴趣于它如何工作的人; epoll 更加复杂一点但是建立在同样的机制上. 无论何时用户应用程序调用 poll, select, 或 ...

  6. linux poll 和 select

    使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一 ...

  7. 多路转接之poll和select

    先看poll(): #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  8. [转] Epoll 相对Poll和Select的优点

    http://blog.csdn.net/summerhust/article/details/18260117 PS: 相对select来说,Poll的监听列表比select更短,并且Poll的监听 ...

  9. Linux中的sleep、usleep、nanosleep、poll和select

    在进行Linux C/C++编程时,可调用的sleep函数有好多个,那么究竟应当调用哪一个了?下表列出了这几个函数间的异同点,可作为参考: 性质 精准度 线程安全 信号安全 sleep libc库函数 ...

随机推荐

  1. openwrt 更改 debug 等级(hostapd)

    https://wiki.openwrt.org/doc/devel/debugging 调试hostapd,其中hostapd的调试等级如下: # Levels (minimum value for ...

  2. DX shader根据顶点设置颜色

    matrix ViewProjMatrix; vector Blue = {0.0f, 0.0f, 1.0f, 0.0f}; struct VS_INPUT { vector position : P ...

  3. Docker 制作mysql镜像

    # 拉取Ubuntu镜像 docker pull docker.io/ubuntu: # 运行一个容器 docker run --name mysql -p 33:3306 -v /mysql:/va ...

  4. Redis持久存储-AOF&RDB

    Redis中数据存储模式有2种:cache-only,persistence;cache-only即只做为"缓存"服务,不持久数据,数据在服务终止后将消失,此模式下也将不存在&qu ...

  5. BestCoder Round #86 A B C

    这次BC终于不像上次一样惨烈 终于A了三题…… 终测ing…… 发一波题解…… A.Price List A题十分无脑 只要把所有数加起来存到sum里 询问的时候大于sum输出1 否则输出0就行了…… ...

  6. css-文本垂直居中(转)

    css-文本垂直居中(转) 在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在 ...

  7. Smarty练习增删改

    <?php //将题目表显示在页面 include("../init.inc.php"); include("../DBDA.php"); $db = n ...

  8. 可写的计算监控(Writable computed observables)

    新手可忽略此小节,可写依赖监控属性真的是太advanced了,而且大部分情况下都用不到. 一般情况下,计算监控的值是通过其他监控属性的值计算出来的,因此它是只读的.这个看似很奇怪,我们有什么办法可以让 ...

  9. 常用JS调试工具使用方法,帮你快速定位问题(Firebug+ IE“开发人员工具”)

    来源: 这里花了点时间小结了下目前项目中比较合适易于上手的JS调试工具.方法.优点与不足以及一些调试相关功能要点或策略,分享给同学们,只当抛砖引玉了,欢迎大家讨论补充. 一.Firebug:如果项目可 ...

  10. call ,apply 和 bind的用法与区别

    作用都是一样的,官方解释:"调用一个对象的一个方法,以另一个对象替换当前对象", 简单来说就是改变当前使用该方法的对象中的this指向: var xw = { name : &qu ...