1
2
|
#include
<sys/poll.h> int poll( struct pollfd
*fds, nfds_t nfds, int timeout); |
总的来说,Poll机制会判断fds中的文件是否可读,如果可读则会立即返回,返回的值就是可读fd的数量,如果不可读,那么就进程就会休眠timeout这么长的时间,然后再来判断是否有文件可读,如果有,返回fd的数量,如果没有,则返回0.
1
2
3
4
5
6
|
sturct
pollfd { int fd; //文件描述符 short
events; //等待的事件 short
revents; //实际发生了的事件 } |
驱动程序里与poll相关的地方有两处:一是构造file_operation结构时,要定义自己的poll函数。二是通过poll_wait来调用上面说到的__pollwait函数,pollwait的代码如下:
1
2
3
4
5
|
staticinline void poll_wait( struct file
* filp, wait_queue_head_t * wait_address,poll_table *p) { if (p
&& wait_address) p->qproc(filp,
wait_address, p); } |
p->qproc就是__pollwait函数,从它的代码可知,它只是把当前进程挂入我们驱动程序里定义的一个队列里而已。它的代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
staticvoid
__pollwait( struct file
*filp, wait_queue_head_t *wait_address, poll_table *p) { struct poll_table_entry
*entry =poll_get_entry(p); if (!entry) return ; get_file(filp); entry->filp
= filp; entry->wait_address
= wait_address; init_waitqueue_entry(&entry->wait,current); add_wait_queue(wait_address,&entry->wait); } |
执行到驱动程序的poll_wait函数时,进程并没有休眠,我们的驱动程序里实现的poll函数是不会引起休眠的。让进程进入休眠,是前面分析的do_sys_poll函数的30行“__timeout = schedule_timeout(__timeout)”。
poll_wait只是把本进程挂入某个队列,应用程序调用poll > sys_poll> do_sys_poll > poll_initwait,do_poll > do_pollfd > 我们自己写的poll函数后,再调用schedule_timeout进入休眠。如果我们的驱动程序发现情况就绪,可以把这个队列上挂着的进程唤醒。可见,poll_wait的作用,只是为了让驱动程序能找到要唤醒的进程。即使不用poll_wait,我们的程序也有机会被唤醒:chedule_timeout(__timeout),只是休眠__time_out这段时间。