POLL的应用:
1. 允许进程决定是否可以对一个或多个打开的文件做非阻塞的读取或写入,这些调用也会阻塞进程,知道给定的文件描述符集合中的任一个可读取或写入。因此它们常用于多个输入或多个输出流而又不会阻塞其中任一个流的应用中。
unsigned int (*poll) (struct file *file,poll_table *wait);
1. 在一个或多个可以指示poll状态变化的等待队列上调用poll_wait。如果当前没有文件描述符可以用来执行I/O,内核将使进程在传递到该系统调用的所有文件描述符对应的等待队列上。
2. 返回一个用来描述操作是否可以立即无阻塞执行的为掩码。
传递给poll的第二个参数。poll_table结构用于在内核中实现poll系统调用,通过poll_wait函数驱动程序向poll_table结构添加一个等待队列。
void poll_wait (struct file*,wait_queue_head_t *.poll_table *);
poll的返回是可以立即执行的为掩码,如下:
POLLIN 如果设备可以问阻塞的读取,就设置该位。
POLLRDNORM如果通常的数据已经就绪,可以读取,就设置该位。一个科读取设备返回(POLLIN | POLLRDNORM)。
……
static irqreturn_t buttons_irq(int irq, void *dev_id)
{
struct pin_desc * pindesc = (struct pin_desc *)dev_id;
unsigned int pinval;
pinval = s3c2410_gpio_getpin(pindesc->pin);
if (pinval)
{
/* 松开 */
key_val = 0x80 | pindesc->key_val;
}
else
{
/* 按下 */
key_val = pindesc->key_val;
}
ev_press = 1; /* 表示中断发生了 */
wake_up_interruptible(&button_waitq); /* 唤醒休眠的进程 */
return IRQ_RETVAL(IRQ_HANDLED);
}
static unsigned forth_drv_poll(struct file *file, poll_table *wait)
{
unsigned int mask = 0;
poll_wait(file, &button_waitq, wait); // 不会立即休眠
if (ev_press)
mask |= POLLIN | POLLRDNORM; //中断发生有数据可读,
return mask;
}
参考韦东山 视频和设备驱动程序