码迷,mamicode.com
首页 > 其他好文 > 详细

poll机制

时间:2021-06-02 19:34:12      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:无法   res   自己   必须   应用   文件中   内核函数   设备文件   loading   

poll机制概述:当应用程序调用poll函数,进程会休眠一段时间,等待事件发生;休眠期间事件发生就被唤醒,poll函数立即返回,返回值为1;如果超过设定的休眠时间事件还是没发生,poll函数也会返回,返回值为0。

 

对于系统调用poll或者select,他们对应的内核函数都是sys_poll,分析sys_poll函数,就可以了解poll机制。

sys_poll位于fs/select.c文件中。

sys_poll的函数调用如下:

sys_poll

  do_sys_poll

    do_poll(nfds, head, &table, timeout)

      技术图片

sys_poll功能说明:

  最终调用了do_poll函数,在for{;;}循环里判断当前“被poll”的设备文件中(可能不止一个),是否由相应的事件发生,如果有则count++

  接下来会判断是否要跳出for{;;}的死循环,跳出的条件有:count非零或者超时(先忽略第三个),如果都没发生,则会休眠设定的时间再进入for{;;}循环,判断事件有没有产生、休眠有没有超时……

 

  do_pollfd函数里调用了驱动程序里我们自己定义的xxx_poll函数:

技术图片

 

自己实现的xxx_poll函数:

 

 技术图片

 

 

其中,poll_wait函数是把当前进程加入休眠的等待队列里,但不会立即休眠,休眠是在do_poll函数里进行的。

总结一下poll机制的流程:

1、应用程序调用poll系统调用

2、poll会调用我们自己在驱动程序中写的xxx_poll函数

3、在xxx_poll函数中把当前进程加入内核中的休眠等待队列,并判断等待事件有没有产生。

4、在系统调用poll中判断我们自己写的xxx_poll函数的返回值

  如果xxx_poll函数返回值非0,说明事件产生,系统调用poll函数立即返回,返回值为非0;

  如果xxx_poll函数返回值非0,说明事件没产生,系统调用poll继续休眠,若休眠超时则返回,返回值为0。

 

 当按钮按下,会进入中断,在中断中设置ev_press = 1并且唤醒进程:

技术图片

 

 

 这里必须在中断中唤醒进程,如果不唤醒,按下按键时系统调用poll函数可能还在执行5s(假设设了5秒)的休眠,无法立即返回。

 

poll机制

标签:无法   res   自己   必须   应用   文件中   内核函数   设备文件   loading   

原文地址:https://www.cnblogs.com/physworld/p/14835330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!