select 和poll函数调用驱动的poll->poll_wait 理解

简介: poll_wait不会挂起当前进程,而是把自己注册到某个事件等待队列中.poll_wait()是用在select系统调用中的. 一般你的代码会有一个struct file_operations结构, 其中fop->poll函数指针指向一个你自己的函数, 在这个函数里应该调用poll...
poll_wait不会挂起当前进程,而是把自己注册到某个事件等待队列中.
poll_wait()是用在select系统调用中的. 

一般你的代码会有一个struct file_operations结构, 
其中fop->poll函数指针指向一个你自己的函数, 
在这个函数里应该调用poll_wait() 

当用户调用select系统调用时,select系统调用会 
先调用 
poll_initwait(&table); 
然后调用你的 
fop->poll(); 
从而将current加到某个等待队列(这里调用poll_wait()), 
并检查是否有效 
如果无效就调用 
schedule_timeout(); 
去睡眠. 

事件发生后,schedule_timeout()回来,调用 
fop->poll(); 
检查到可以运行,就调用 
poll_freewait(&table); 

从而完成select系统调用. 

重要的是fop->poll()里面要检查是否就绪, 
如果是,要返回相应标志 
 
挂起与否是在sys_select()或sys_poll()两个系统调用中根据 
用户传入的timeout和fd的具体情况决定的,是这两个系统调用 
将进程挂起的 
你的file_operation-->poll()只需要调用poll_wait(),并判断是否就绪, 
如果就绪就设置标志,这样即可.
 
假设我没有使用timeout,也没有signal 
我只关心writeable事件,但是设备在poll时总返回POLLRD事件, 

那么就会出现这种情况啊,不停的加poll_entry成员到睡眠队列,总有一天会溢出 啊。
 
不会啊,因为如果没有timeout和signal,它不会醒的, 
只要他醒了,只有三种可能: 
1,timeout 
2,signal 
3,设备就绪
 
如果当前不可读,那么在sys_poll->do_poll中当前进程就会睡眠在等待队列上,这个等待队列是由驱动程序提供的(就是poll_wait中传入的那个)。当可读的时候,驱动程序可能有一部分代码运行了(比如驱动的中断服务程序),那么在这部分代码中,就会唤醒等待队列上的进程,也就是之前睡眠的那个,当那个进程被唤醒后do_poll会再一次的调用驱动程序的poll函数,这个时候应用程序就知道是可读的了。
目录
相关文章
浅谈select,poll和epoll的区别
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! select,poll和epoll其实都是操作系统中IO多路复用实现的方法。 select select方法本质其实就是维护了一个文件描述符(fd)数组,以此为基础,实现IO多路复用的功能。
浅谈select,poll和epoll的区别
|
5月前
|
前端开发 Java 索引
pollLast() 和poll啥区别
pollLast() 和poll啥区别
|
5月前
|
Unix Linux API
select和poll的区别
select和poll的区别
|
Linux
一文搞懂select、poll和epoll区别
一文搞懂select、poll和epoll区别
790 1
一文搞懂select、poll和epoll区别
一文搞懂select、poll和epoll区别(上)
一文搞懂select、poll和epoll区别
182 0
一文搞懂select、poll和epoll区别(上)
|
存储 监控 Linux
一文搞懂select、poll和epoll区别(下)
一文搞懂select、poll和epoll区别
317 0
一文搞懂select、poll和epoll区别(下)
|
Linux 调度 网络协议
poll&&epoll实现分析(一)——poll实现
0.等待队列 在Linux内核中等待队列有很多用途,可用于中断处理、进程同步及定时。我们在这里只说,进程经常必须等待某些事件的发生。等待队列实现了在事件上的条件等待: 希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制全。
1055 0
|
存储 网络协议 Linux
select的限制以及poll的使用
1.先说select在多路IO中的限制:1)linux中每个程序能够打开的最多文件描述符是有限制的。默认是1024.可以通过ulimit -n进行查看和修改: xcy@xcy-virtual-machine:~/test/sock10_poll$ ulimit -n1024xcy@xcy-vi...
1157 0
|
消息中间件 Unix C语言