select系统调用及驱动实现方法(2012-02-12)

简介: select系统调用及驱动实现方法一.系统提供select函数来实现多路复用输入/输出模型。原型:#include linux/poll.h>int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。

select系统调用及驱动实现方法


一.系统提供select函数来实现多路复用输入/输出模型。原型:


#include linux/poll.h>
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 

参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。 

返回值正整数,表示满足的文件描述符的个数.

返回0,表示超时.

返回-1,且errno为 -EENTIR,表示select在阻塞时被信号中断.

返回-1,其他情况下的错误返回,会设置相应errno.


二.使用select进行I/O复用的方法


1.将需要监控的文件描述符加入文件描述符集合.

  文件描述符集合结构:struct fd_set.内核提供了一些用来操作文件描述符集合:

  FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。
  

   FD_SET(int fd,fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。
  

   FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。
  

   FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。 


2.调用select进行监控.


3.查看文件描述符的集合状态是否发生变化.

  Select在返回之后,如果有满足条件的文件描述符,那么相应的fd_set会发生变化,其中包含的都是满足条件的fd,因此用FD_ISSET来判断某个fd是否满足要求.


三.select系统调用的实现


   select系统调用由驱动的poll方法实现,原型为:

unsigned int poll(struct file *filp,poi_table *wait);

poll 设备方法负责完成:

1.使用poll_wait将等待队列添加到poll_table中.

  void poll_wait(struct file *,wait_queue_head_t *,poll_table *);

2.返回描述设备是否可读或可写的掩码. 

  POLLIN 设备可读

  POLLRDNORM 数据可读

  POLLOUT 设备可写

  POLLWRNORM 数据可写

设备可读一般返回(POLLIN|POLLRDNORM),设备可写一般返回(POLLOUT|POLLWRNORM).


四.POLL工作原理解析


   在设备的poll方法的实现过程中,会发现并没有将进程阻塞的语句,这是因为Poll方法只是做一个登记,真正的阻塞在fs/select.c中的do_select函数.do_select是select系统调用对应的内核函数.do_select根据poll方法返回值来进行判断,如果条件不满足,那么do_select中会调用poll_schedule_timeout将进程设置为可中断睡眠.(待续...)

目录
相关文章
|
3月前
|
监控 网络协议 Linux
彻底解密:select,poll底层系统调用的核心思想原理
彻底解密:select,poll底层系统调用的核心思想原理
|
7月前
|
网络协议 Linux 数据处理
xenomai UDD介绍与UDD用户态驱动示例
Xenomai UDD(User-space Device Driver)是一种用户态设备驱动框架,允许用户态程序直接操作硬件,减少内核态切换和数据拷贝,提高实时性和性能。UDD与Linux的UIO(Userspace I/O)类似,主要区别在于中断处理,UDD基于RTDM和Xenomai调度,确保实时中断响应。示例展示了如何使用UDD进行GPIO操作,对比了UDD和RTnet在网卡收发包时的CPU耗时。UDD适用于中断少、重输出的场景,如GPIO输出和网络发包。
219 0
xenomai UDD介绍与UDD用户态驱动示例
|
7月前
|
监控
第三十八章 使用^%SYS.MONLBL检查例程性能
第三十八章 使用^%SYS.MONLBL检查例程性能
33 0
|
7月前
2023驱动保护学习 -- 通过驱动保护进程
2023驱动保护学习 -- 通过驱动保护进程
45 0
|
7月前
|
Go 开发工具 C++
2023驱动保护学习 -- 创建第一个驱动程序
2023驱动保护学习 -- 创建第一个驱动程序
70 0
|
存储 Cloud Native Linux
C++ 表驱动方法代替if-else
C++ 表驱动方法代替if-else
|
传感器 监控 Unix
Linux多路复用Select()与poll()函数
Linux多路复用Select()与poll()函数
90 0
|
Linux
linux开发各种I/O操作简析,以及select、poll、epoll机制的对比
linux开发各种I/O操作简析,以及select、poll、epoll机制的对比
284 1
linux开发各种I/O操作简析,以及select、poll、epoll机制的对比