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将进程设置为可中断睡眠.(待续...)

目录
相关文章
|
14天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
6天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
|
9天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
845 25
|
8天前
|
机器学习/深度学习 人工智能 搜索推荐
万字长文深度解析最新Deep Research技术:前沿架构、核心技术与未来展望
近期发生了什么自 2025 年 2 月 OpenAI 正式发布Deep Research以来,深度研究/深度搜索(Deep Research / Deep Search)正在成为信息检索与知识工作的全新范式:系统以多步推理驱动大规模联网检索、跨源证据。
580 46
|
2天前
|
监控 BI 数据库
打工人救星!来看看这两家企业如何用Quick BI让业务更高效
Quick BI专业版监控告警助力企业高效运作,通过灵活配置规则与多渠道推送,让数据异常早发现、快响应,推动业务敏捷决策与持续增长。
打工人救星!来看看这两家企业如何用Quick BI让业务更高效
|
8天前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
563 42