linux中的poll机制分析
来源:互联网 发布:win10 linux 双系统 编辑:程序博客网 时间:2024/06/02 07:01
最近看了一下Linux Poll 机制的实现,看了韦老师的分析文档,总结如下:
int poll(struct pollfd *fds,nfds_t nfds, int timeout);
总的来说,Poll机制会判断fds中的文件是否可读,如果可读则会立即返回,返回的值就是可读fd的数量,如果不可读,那么就进程就会休眠timeout这么长的时间,然后再来判断是否有文件可读,如果有,返回fd的数量,如果没有,则返回0.
在内核中大致上实现过程:
当应用程序调用poll函数的时候,会调用到系统调用sys_poll函数,该函数最终调用do_poll函数,do_poll函数中有一个死循 环,在里面又会利用do_pollfd函数去调用驱动中的poll函数(fds中每个成员的字符驱动程序都会被扫描到),驱动程序中的Poll函数的工作 有两个,一个就是调用poll_wait 函数,把进程挂到等待队列中去(这个是必须的,你要睡眠,必须要在一个等待队列上面,否则到哪里去唤醒你呢??),另一个是确定相关的fd是否有内容可 读,如果可读,就返回1,否则返回0,如果返回1 ,do_poll函数中的count++, 然后 do_poll函数然后判断三个条件(if (count ||!timeout || signal_pending(current)))如果成立就直接跳出,如果不成立,就睡眠timeout个jiffes这么长的时间(调用schedule_timeout实现睡眠),如果在这段时间内没有其他进程去唤醒它,那么第二次执行判断的时候就会跳出死循环。如果在这段时间内有其他进程唤醒它,那么也可以跳出死循环返回(例如我们可以利用中断处理函数去唤醒它,这样的话一有数据可读,就可以让它立即返回)。
- static unsigned int fourth_drv_poll(struct file *file, poll_table *wait)
- {
- unsigned int mask = 0;
- /* 该函数,只是将进程挂在button_waitq队列上,而不是立即休眠 */
- poll_wait(file, &button_waitq, wait);
- /* 当没有按键按下时,即不会进入按键中断处理函数,此时ev_press = 0
- * 当按键按下时,就会进入按键中断处理函数,此时ev_press被设置为1
- */
- if(ev_press)
- {
- mask |= POLLIN | POLLRDNORM; /* 表示有数据可读 */
- }
- /* 如果有按键按下时,mask |= POLLIN | POLLRDNORM,否则mask = 0 */
- return mask;
- }
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <poll.h>
- /* fourth_test
- */
- int main(int argc ,char *argv[])
- {
- int fd;
- unsigned char key_val;
- struct pollfd fds;
- int ret;
- fd = open("/dev/buttons",O_RDWR);
- if (fd < 0)
- {
- printf("open error\n");
- }
- fds.fd = fd;
- fds.events = POLLIN;
- while(1)
- {
- /* A value of 0 indicates that the call timed out and no file descriptors were ready
- * poll函数返回0时,表示5s时间到了,而这段时间里,没有事件发生"数据可读"
- */
- ret = poll(&fds,1,5000);
- if(ret == 0)
- {
- printf("time out\n");
- }
- else /* 如果没有超时,则读出按键值 */
- {
- read(fd,&key_val,1);
- printf("key_val = 0x%x\n",key_val);
- }
- }
- return 0;
- }
- linux中的poll机制分析
- Linux poll机制分析
- Linux poll机制分析
- Linux poll机制分析
- Linux中的poll机制
- 驱动中的poll机制分析
- Linux poll机制精彩分析
- Linux poll机制精彩分析
- Linux poll机制精彩分析
- Linux poll机制精彩分析
- linux-3.4.2之poll机制分析
- linux驱动程序中的poll机制编程
- poll机制分析
- poll机制分析[转载]
- poll机制分析
- poll机制分析
- Poll机制分析
- poll机制分析
- tab键在packettracer的作用
- SP2010开发和VS2010专家"食谱"--第六章节--Web Services和REST(1)--通过REST获得数据
- 装饰模式
- epoll的设计与实现
- struts中OGNL的投影(过滤)
- linux中的poll机制分析
- 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
- 企业网站需要如何操作
- android application创建不了,无法选择 compile with
- SP2010开发和VS2010专家"食谱"--第六章节--Web Services和REST(2)--筛选列表数据
- C#设计模式之观察者
- Linux内存高,触发oom-killer问题解决
- 如何在终端编辑命令
- 微信公众号的类型和功能