



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
I/O多路复用详解支持I/O复用的系统调用select智游推送继上次讲解I/O多路复用详解支持I/O复用的系统调用poll这次讲解的是I/O多路复用详解支持I/O复用的系统调用select。1、select函数select系统调用是用来让我们的程序监视多个文件句柄(file descrptor)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变。文件在句柄在Linux里很多,如果你man某个函数,在函数返回值部分说到成功后有一个文件句柄被创建的都是的,如man socket可以看到“On success, afile descrptor for the new socket is returned.”而man 2 open可以看到“open()and creat() return the new filedescrptor”,其实文件句柄就是一个整数,看socket函数的声明就明白了:int socket(int domain, int type, int protocol);当然,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr,0就是stdin,1就是stdout,2就是stderr。比如下面这两段 代码 都是从标准输入读入9个字节字符:#include#include#includeint main(int argc, char * argv)char buf10 = “”;read(0, buf, 9); /* 从标准输入 0 读入字符 */fprintf(stdout, “%sn”, buf); /* 向标准输出 stdout 写字符 */return 0;/* *上面和下面的代码都可以用来从标准输入读用户输入的9个字符* */#include#include#includeint main(int argc, char * argv)char buf10 = “”;fread(buf, 9, 1, stdin); /* 从标准输入 stdin 读入字符 */write(1, buf, strlen(buf);return 0;继续上面说的select,就是用来监视某个或某些句柄的状态变化的。select函数原型如下:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);函数的最后一个参数timeout显然是一个超时时间值,其类型是struct timeval *,即一个structtimeval结构的变量的指针,所以我们在程序里要申明一个struct timevaltv;然后把变量tv的地址&tv传递给select函数。struct timeval结构如下:struct timeval long tv_sec; /* seconds */long tv_usec; /* microseconds */;第2、3、4三个参数是一样的类型: fd_set *,即我们在程序里要申明几个fd_set类型的变量,比如rdfds, wtfds,exfds,然后把这个变量的地址&rdfds, &wtfds, &exfds传递给select函数。这三个参数都是一个句柄的集合,第一个rdfds是用来保存这样的句柄的:当句柄的状态变成可读的时系统就会告诉select函数返回,同理第二个wtfds是指有句柄状态变成可写的时系统就会告诉select函数返回,同理第三个参数exfds是特殊情况,即句柄上有特殊情况发生时系统会告诉select函数返回。特殊情况比如对方通过一个socket句柄发来了紧急数据。如果我们程序里只想检测某个socket是否有数据可读,我们可以这样:fd_set rdfds; /* 先申明一个 fd_set 集合来保存我们要检测的 socket句柄 */struct timeval tv; /* 申明一个时间变量来保存时间 */int ret; /* 保存返回值 */FD_ZERO(&rdfds); /* 用select函数之前先把集合清零 */FD_SET(socket, &rdfds); /* 把要检测的句柄socket加入到集合里 */tv.tv_sec = 1;tv.tv_usec = 500; /* 设置select等待的最大时间为1秒加500毫秒 */ret = select(socket + 1, &rdfds, NULL, NULL, &tv); /* 检测我们上面设置到集合rdfds里的句柄是否有可读信息 */if(ret maxfd) maxfd = sa;if(sb maxfd) maxfd = sb;if(sc maxfd) maxfd = sc;然后调用select函数:ret = select(maxfd + 1, &rdfds, NULL, NULL, &tv); /* 注意是最大值还要加1 */同样的道理,如果我们要检测用户是否按了键盘进行输入,我们就应该把标准输入0这个句柄放到select里来检测,如下:FD_ZERO(&rdfds);FD_SET(0, &rdfds);tv.tv_sec = 1;tv.tv_usec = 0;ret = select(1, &rdfds, NULL, NULL, &tv); /* 注意是最大值还要加1 */if(ret 0)pe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业废弃物堆肥处理技术产业链分析2025年报告
- 2025事业单位招聘考试公共基础知识题库及答案详解
- 2025执业药师考试《药学专业知识一》备考试题及答案
- 市政道路水泥混凝土路面专项施工方案
- 2025年医疗行业税收政策调整对企业创新能力的影响及应对策略
- 听赏 教学设计-2025-2026学年初中音乐苏少版五线谱2024七年级下册-苏少版五线谱2024
- 2025年文化娱乐行业消费者行为变化与市场细分策略研究报告
- Unit1 Lesson5 In the Living Room(教学设计)-2024-2025学年冀教版(三起)英语六年级上册
- 生态渔业循环养殖项目2025年技术创新与应用研究报告
- 智能建筑系统集成与节能降耗在绿色历史文化建筑保护中的应用研究
- 2025年科研项目经理专业知识考试题目答案解析
- 2025广东肇庆市怀集县卫生事业单位招聘102人笔试模拟试题及答案解析
- 青马考试题目及答案
- 2024-2025学年广东省深圳市南山区四年级(下)期末数学试卷
- 算力中心计算任务优化方案
- 劳务派遣工作知识培训课件
- AutoCAD电气工程制图 课件 项目1 低压配电柜的绘制与识图
- 无人机反制设备原理课件
- 北京市2025年普通高中学业水平等级性考试政治试题(解析版)
- 2025年村干部考试试题(含答案)
- 新华书店招聘面试题库全攻略:行业知识、技能与面试技巧
评论
0/150
提交评论