在linux驱动中,有时候需要实现非阻塞的read和write操作,但用户不可能周期地去查询设备是否可读或可写吧,那在驱动中就需要实现poll接口,然后在应用层调用select系统调用。
在驱动中需要实现poll接口,其主要内容为通过poll_wait(读等待队列,wait)、poll_wait(写等待队列)将读、写等待队列添加到wait表中。注意:poll_wait()本身并不是阻塞的调用,真正的阻塞是应用层调用select()接口,poll()接口就是添加读、写等待队列,返回POLLIN或POLLOUT的状态。poll_wait()函数所做的工作是把当前进程添加到
wait 参数指定的等待列表(poll_table)中。通常在接收中断中根据某个接收条件调用wait_up_interruptible(读等待队列),而在发送中断中根据某个发送条件调用wait_up_interruptible(写等待队列)。那么有人就会问:如果一个线程只操作写,另一个线程只操作读,而由于poll()中添加了读与写的等待队列,两个条件中的一个都会唤醒select()去遍历监听的读、写文件set。如果接收产生了条件唤醒了select(),那是不是也会唤醒发送的那个线程呢?这就需要靠应用层在调用select()接口时的配置了。详细的调用如下图所示:
时间: 2024-10-12 19:21:17