仰望星空
分类: 嵌入式
2015-11-28 22:23:58
一个结构数组,struct pollfd结构如下:
struct pollfd{
int fd; //文件描述符
short events; //请求的事件
short revents; //返回的事件
}
使用的时候是这样使用的, ret = poll(&fds,1,5000); fds.fd = fd fds.events = POLLIN
然后对ret进行判断,
从它的代码可知,它只是把当前进程挂入我们驱动程序里定义的一个队列里而已。它的代码如下:
执行到驱动程序的poll_wait函数时,进程并没有休眠,我们的驱动程序里实现的poll函数是不会引起休眠的。让进程进入休眠,是do_sys_pol
l函数的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这段时间。
poll()函数经过一系列的函数调用,最终调用的是do_pollfd()函数,这个函数对应的就是驱动里我们注册的函数(?),其源代码如下:
四、调用整体过程
通过上边的分析,Poll不是直接调用的,有一个过程: