三、支持轮询操作的globalfifo驱动
  在globalfifo的poll()函数中,首先将设备结构体重的r_wait和w_wait等待队列头加到等待队列表,globalfifo设备驱动的poll()函数如下:
static unsigned int gloablfif0_poll(struct file *filp,poll_table *wait)
{
unsigned int mask = 0;
struct globalfifo_dev *dev = filp->private_data;
down(&dev->sem);
poll_wait(filp,&dev->r_wait , wait)  ;
poll_wait(filp,&dev->r_wait , wait)  ;
if(dev->current_len != 0)
{
mask |= POLLIN | POLLRDNORM;
}
if(dev->current_len != GLOBALFIFO_SIZE)
{
mask |= POLLOUT | POLLWRNORM;
}
up(&dev->sem);
return mask;
}
  四、总结
  · 阻塞与非阻塞操作:
  · 定义并初始化等待对列头;
  · 定义并初始化等待队列;
  · 把等待队列添加到等待队列头
  · 设置进程状态(TASK_INTERRUPTIBLE(可以被信号打断)和TASK_UNINTERRUPTIBLE(不能被信号打断))
  · 调用其它进程
  poll机制:
  · 把等待队列头加到poll_table
  · 返回表示是否能对设备进行无阻塞读,写访问的掩码