select与poll的接口说明

在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()接口时的配置了。详细的调用如下图所示:

关于驱动中的poll_wait,它的作用就是把当前进程添加到wait参数指定的等待列表(poll_table)中。需要注意的是这个函数是不会引起阻塞。那如果poll_wait不阻塞,当应用层调用select()系统调用时,真正实现阻塞功能是哪里实现的呢?其实真正的阻塞是在应用层上的select接口函数中。

 

poll_wait()是用在select系统调用中的. 
一般你的代码会有一个struct file_operations结构, 
其中fop->poll函数指针指向一个你自己的函数, 
在这个函数里应该调用poll_wait() 

当用户调用select系统调用时,select系统调用会 
先调用 
poll_initwait(&table); 
然后调用你的 
fop->poll(); 
从而将current加到某个等待队列(这里调用poll_wait()), 
并检查是否有效 
如果无效就调用 
schedule_timeout(); 
去睡眠. 

事件发生后,schedule_timeout()回来,调用 
fop->poll(); 
检查到可以运行,就调用 
poll_freewait(&table); 

从而完成select系统调用. 

重要的是fop->poll()里面要检查是否就绪, 
如果是,要返回相应标志 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
selectpoll都是用于多路复用(multiplexing)IO操作的系统调用,用于在多个文件描述符上等待可读、可写或异常事件的发生。 1. select:早期的多路复用机制,适用于文件描述符数量较少的情况。它将一组文件描述符传递给内核,并在这些描述符上等待事件发生。当有一个或多个描述符准备好时,select函数将返回,并且可以通过遍历描述符集合来确定哪些描述符准备好了。 2. poll:与select类似,也是多路复用的一种机制,但在设计上更加灵活和高效。poll函数接受一个pollfd结构体数组,每个结构体指定一个文件描述符和所关心的事件类型。调用poll后,内核会检查每个pollfd中指定的描述符,返回就绪的描述符以及就绪的事件类型。 区别: - select使用fd_set来存放文件描述符集合,而poll使用pollfd数组来存放。 - select每次调用都需要将fd_set从用户空间拷贝到内核空间,而poll只需要一次传递pollfd数组的指针。 - select有文件描述符数量上限限制,而poll没有(但是并不是无限制)。 - select返回就绪的文件描述符时需要遍历整个fd_set,而poll返回就绪的文件描述符时只需检查就绪的pollfd。 - select在文件描述符数量较少时性能可能较好,而poll在文件描述符数量较多时性能可能更好。 需要注意的是,selectpoll都是阻塞调用,即在没有任何事件发生时会一直等待,直到有事件发生或超时。为了实现非阻塞的IO操作,可以使用非阻塞文件描述符或结合其他机制(如线程、信号等)来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值