您的位置:首页 > 大数据 > 人工智能

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

2012-04-10 19:53 369 查看
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函数,这个时候应用程序就知道是可读的了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: