[个人推荐]理解poll_wait
来源:互联网 发布:迅龙数据恢复软件安卓 编辑:程序博客网 时间:2024/05/29 19:18
poll_wait()是用在select系统调用中的.
一般你的代码会有一个struct file_operations结构, 其中fop->poll函数指针指向一个你自己的函数, 在这个函数里应该调用poll_wait()
当用户调用select系统调用时,select系统调用会先调用
poll_initwait(&table);
然后调用你的
fop->poll();
从而将current加到某个等待队列(这里调用poll_wait()),
并检查是否有效
如果无效就调用
poll_schedule_timeout ();
去睡眠.
事件发生后,poll_schedule_timeout()回来,调用
检查到可以运行,就调用
poll_freewait(&table);
从而完成select系统调用.
-------------------------------------------------------------------------------------------
重要的是fop->poll()里面要检查是否就绪,
如果是,要返回相应标志
参见内核的函数:
fs/select.c/do_select()
1 等待队列的使用
.private = tsk, \
.func = default_wake_function, \
.task_list = { NULL, NULL } }
wait_queue_t name = __WAITQUEUE_INITIALIZER(name, tsk)
一目了然,给wait这个等待队列赋值,private用来表示被唤醒的进程,这里current代表了本进程, 而func是被唤醒时调用的回调函数, 唤醒private!
将wait加入到等待队列w_wait中, 被唤醒时遍历w_wait队列!
唤醒w_wait, 遍历队列中的wait, 调用wait的func来唤醒private,参见__wake_up_common
task 1:
DECLARE_WAITQUEUE(wait, current);
add_wait_queue(w_wait, wait);
__set_current_state(TASK_INTERRUPTIBLE);
schedule();
//task1 进程休眠
................//唤醒后从这儿执行
wake_up(w_wait);
2 poll_wait使用
主要用于非阻塞访问时应用层select的调用
驱动实现为
down(&dev->sem);
poll_wait(filp, &dev->r_wait, wait); //读
poll_wait(filp, &dev->w_wait, wait); //写
/*fifo非空*/
if (dev->current_len != 0)
{
mask |= POLLIN | POLLRDNORM;
}
/*fifo非满*/
if (dev->current_len != GLOBALFIFO_SIZE)
{
mask |= POLLOUT | POLLWRNORM;
}
up(&dev->sem);
和do_select配合使用
{
if (p && wait_address)
p->qproc(filp, wait_address, p); //是在do_select中的poll_init_wait中为__pollwait
}
/* Add a new entry */
static void __pollwait(struct file *filp, wait_queue_head_t *wait_address,poll_table *p)
{
struct poll_wqueues *pwq = container_of(p, struct poll_wqueues, pt);
struct poll_table_entry *entry = poll_get_entry(pwq);
if (!entry)
return;
get_file(filp);
entry->filp = filp;
entry->wait_address = wait_address;
entry->key = p->key;
init_waitqueue_func_entry(&entry->wait, pollwake);
entry->wait.private = pwq;
add_wait_queue(wait_address, &entry->wait); // 把p中的entry->wait加入到等待队列
}
void poll_initwait(struct poll_wqueues *pwq)
{
init_poll_funcptr(&pwq->pt, __pollwait);
pwq->polling_task = current;
pwq->triggered = 0;
pwq->error = 0;
pwq->table = NULL;
pwq->inline_index = 0;
}
会在其他task唤醒 然后返回给do_select; do_select实现休眠等待唤醒和select中的延时!
- [个人推荐]理解poll_wait
- 理解poll_wait
- 理解poll_wait
- poll_wait新的理解
- poll_wait新的理解
- 转载_理解poll_wait
- poll_wait新的理解
- poll_wait新的理解
- 个人理解的在线推荐
- 推荐系统个人理解(理论部分)
- 推荐系统个人理解(实践部分)
- select 和poll函数调用驱动的poll->poll_wait 理解
- select 和poll函数调用驱动的poll->poll_wait 理解
- do_select()函数分析,理解select(),poll(),poll_wait()函数的关系
- select 和poll函数调用驱动的poll->poll_wait 理解
- 个人推荐
- [转]do_select()函数分析,理解select(),poll(),poll_wait()函数的关系
- 理解矩阵(个人认为这是关于矩阵最精彩的理解,推荐~~)
- Vhost Architecture(基于kernel3.10.0 & qemu2.0.0)
- linux内核的等待队列使用方法,wait_queue_head_t,进程休眠
- linux poll 和 等待队列休眠的关系(基于kernel 3.10.0)
- [个人推荐] Linux poll机制分析(基于内核3.10.0)
- 安卓优化
- [个人推荐]理解poll_wait
- select(poll)实现代码实现分析(基于kernel 3.10.0)
- 新手对Bash环境变量解析漏洞的理解 http://www.linuxidc.com/Linux/2014-10/107984.htm
- select(poll)实现代码实现分析(基于kernel 3.10.0)
- KVM源代码分析1:基本工作原理
- Linux 新api eventfd
- 令狐冲的SDL(安全开发周期)引进手记
- ViewPager实现无线循环滚动
- QEMU VCPU线程同步机制之QemuCond(基于QEMU2.0.0)