在linux应用编程中,经常要用到select和poll调用。select和poll的功能本质是一样的,都允许进程决定是否可以对一个或多个打开的文件做非阻塞的读或写。
举几个工作中用到的select或poll例子:1、编解码中,监听几个编解码通道的;2、对于主CPU,监听挂载的几个dsp;3、socket编程等等。
对于驱动程序而言,上面的系统调用通过驱动程序中file_operations中的poll方法实现。
poll的方法原型是:
unsigned int (*poll) (struct file *, struct poll_table_struct *);
该方法分为两步处理:
1、对可能引起设备文件变化的等待队列调用poll_wait()函数,将对应的等待队列头添加到poll_table.
2、返回一个用来描述操作是否可以立即无阻塞读写访问的位掩码.
按照设备驱动中poll()函数的典型模板(linux设备驱动开发详解第2版),完成scullfifo。关于select系统调用,等待队列这些深入的细节,过段时间要专门kgdb一下。
static unsigned int scull_poll(struct file *filp, poll_table *wait)
{
unsigned int mask = 0;
struct scull_dev *dev = filp->private_data;
down(&dev->sem);
poll_wait(filp, &dev->r_wait, wait);
poll_wait(filp, &dev->w_wait, wait);
if(dev->current_len != 0)
{
mask |= POLLIN | POLLRDNORM;
}
if(dev->current_len != SCULL_SIZE )
{
mask |= POLLOUT | POLLWRNORM;
}
up(&dev->sem);
return mask;
}
select系统调用,可以监听scull设备文件是否可读或者可写。