三、支持轮询操作的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
· 返回表示是否能对设备进行无阻塞读,写访问的掩码