当前位置: 技术问答>linux和unix
poll函数问题
来源: 互联网 发布时间:2016-05-05
本文导语: static int poll_one(struct file *file) { int retval = 1; poll_table *table; struct poll_wqueues pwq; poll_initwait(&pwq); table = &pwq.pt; for (;;) { int mask; set_current_state(TASK_INTERRUPTIBLE);----------设置当前进程状态为可以被信号中断。...
static int poll_one(struct file *file)
{
int retval = 1;
poll_table *table;
struct poll_wqueues pwq;
poll_initwait(&pwq);
table = &pwq.pt;
for (;;) {
int mask;
set_current_state(TASK_INTERRUPTIBLE);----------设置当前进程状态为可以被信号中断。
mask = file->f_op->poll(file, table);--------调用poll函数把当前进程挂起到poll的链表。
if (mask & POLLIN)--------检查是否设备可被不阻塞地读,但是为什么可以的话就break ? break;
table = NULL;
if (signal_pending(current)) {-----signal pending是什么意思,做什么,很晕,高人解释下
retval = -ERESTARTSYS;
break;
}
schedule();---------挂起后,执行调度,但是这个for循环何时跳出呢,是在上面的break处吗?还是在别的函数中有break? }
set_current_state(TASK_RUNNING);
poll_freewait(&pwq);
return retval;
}
我上面的解释是否正确,以及一些问题,大家帮忙了。这个函数看着有点晕,对poll这边不是很了解,大家帮忙。谢谢了。
{
int retval = 1;
poll_table *table;
struct poll_wqueues pwq;
poll_initwait(&pwq);
table = &pwq.pt;
for (;;) {
int mask;
set_current_state(TASK_INTERRUPTIBLE);----------设置当前进程状态为可以被信号中断。
mask = file->f_op->poll(file, table);--------调用poll函数把当前进程挂起到poll的链表。
if (mask & POLLIN)--------检查是否设备可被不阻塞地读,但是为什么可以的话就break ? break;
table = NULL;
if (signal_pending(current)) {-----signal pending是什么意思,做什么,很晕,高人解释下
retval = -ERESTARTSYS;
break;
}
schedule();---------挂起后,执行调度,但是这个for循环何时跳出呢,是在上面的break处吗?还是在别的函数中有break? }
set_current_state(TASK_RUNNING);
poll_freewait(&pwq);
return retval;
}
我上面的解释是否正确,以及一些问题,大家帮忙了。这个函数看着有点晕,对poll这边不是很了解,大家帮忙。谢谢了。
|
mask = file->f_op->poll(file, table);--------调用poll函数把当前进程挂起到poll的链表。
1 这个应该是去取设备的mask值
if (mask & POLLIN)--------检查是否设备可被不阻塞地读,但是为什么可以的话就break ?
2 如果设备已经可以不阻塞地读的话,就应该立刻返回,不然应该执行schedule()切换出去
break;
table = NULL;
if (signal_pending(current)) {-----signal pending是什么意思,做什么,很晕,高人解释下
3 当前进程有信号需要处理,中断等待,处理信号,同时返回一个错误码
retval = -ERESTARTSYS;
break;
}
schedule();---------挂起后,执行调度,但是这个for循环何时跳出呢,是在上面的break处吗?还是在别的函数中有break?
4 for循环何时跳出?出现2或3的时候
}
1 这个应该是去取设备的mask值
if (mask & POLLIN)--------检查是否设备可被不阻塞地读,但是为什么可以的话就break ?
2 如果设备已经可以不阻塞地读的话,就应该立刻返回,不然应该执行schedule()切换出去
break;
table = NULL;
if (signal_pending(current)) {-----signal pending是什么意思,做什么,很晕,高人解释下
3 当前进程有信号需要处理,中断等待,处理信号,同时返回一个错误码
retval = -ERESTARTSYS;
break;
}
schedule();---------挂起后,执行调度,但是这个for循环何时跳出呢,是在上面的break处吗?还是在别的函数中有break?
4 for循环何时跳出?出现2或3的时候
}
|
晕,你的设备可用了,当然要返回给其他code使用, 其他code还等着用这个设备。你都可用了,还赖在这里干什么?
signal_pending很简单,就是检查一个标志,自己去看这个函数
signal_pending很简单,就是检查一个标志,自己去看这个函数
|
linux 群 8709932 欢迎大家的加入
|
如果返回的是0,代表什么含义?请赐教呀