- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux中select函数学习及实例笔记
Linux中select函数学习及实例笔记Unix中的函数select和poll用来,支持Unix中I/O复用的功能,在Unix中I/O模型可以分为以一几种:(1)阻塞I/O(2)非阻塞I/O(3)I/O复用(select和poll)(4)信号驱动I/O(SIGIO)(5)异步I/O 其中,现在比较流行的I/O模型是阻塞I/O模型.阻塞I/O是当应用程序和内核交换数据时,由于内核还没有准备好数据,那么应用程序必须进行阻塞,不能 继续执行,直到内核的数据准备好!应用程序取到数据返回后,阻塞过程结束!但返回的结果也并不一定是正确的!这里只是举一个简单的例子!也许情况会更加的 复杂! 非阻塞I/O,例如在和内核交换数据时,如果内核的数据没有准备好,那么应用程序不会一真等待,会有一个返回信息,以判断是那里出了问题!这样有助于确认是在那个阶段出了问题! I/O复用,我们就可以调用系统调用select和poll!在这两个系统调用中的某一个阻塞,而不是真正的阻塞I/O系统调用! 下面主要介绍I/O复用中的select函数!select函数可以指示内核等待多个事件中的任一个发生,仅在一个或多个事件发生,或者等待一个足够的时间后才唤醒进程!select函数的原型如下:#include?sys/types.h#includesys/time.hint select (int maxfdp1,fd_set *readset,fd_set * writeset,fd_set excpetset,const struct timeval *timeout);返回值:准备好的描述符的正数目 0---超时 -1---出错!其中最后一个参数是一个结构体的指针,它表示等待内核中的一组描述符任一个准备好需要花费多久的时间!其中timeval指定了秒数和微秒数。struct timeval{ long tv_sec;//秒数 long tv_usec;//微秒数}; 将 timeout设置为空指针时,会永远等待下去,等待固定的时间:如果timeout指向的timeval中的具体的值时,会等待一个固定的时间,不等待立刻返回,这时timeval中的tv_sec和tv_usec为0.select有三个可能的返回值。1.正常情况下返回就绪的文件描述符个数;2.经过了timeout时长后仍无设备准备好,返回值为0;3.如果select被某个信号中断,它将返回-1并设置errno为EINTR。4.如果出错,返回-1并设置相应的errno。EBADF 文件描述词为无效的或该文件已关闭EINTR 此调用被信号所中断EINVAL 参数n 为负值。ENOMEM 核心内存不足?中间的三个参数readset writeset和excpetset指定我们要让内核测试读、写、异常条件所需的描述字!函数select使用描述字集,它一般是一个整型的数组,每个数中的每一位代表一个描述符!系统提供了4个宏对描述符集进行操作:#include sys/select.h#include sys/time.h//设置文件描述符集fdset中对应于文件描述符fd的位void FD_SET(int fd, fd_set *fdset);//清除文件描述符集fdset中对应于文件描述符fd的位(设置为0)void FD_CLR(int fd, fd_set *fdset);//清除文件描述符集fdset中的所有位(既把所有位都设置为0)void FD_ZERO(fd_set *fdset);//在调用select后使用FD_ISSET来检测文件描述符集fdset中对应于文件描述符fd的位是否被设置。void FD_ISSET(int fd, fd_set *fdset);例如下面一段代码:fd_set readset;FD_ZERO(readset);FD_SET(5, readset);FD_SET(33, readset);则文件描述符集readset中对应于文件描述符6和33的相应位被置为1,如图1所示:??再执行如下程序后:FD_CLR(5, readset);则文件描述符集readset对应于文件描述符6的相应位被置为0,如图2所示: 通常,操作系统通过宏FD_SETSIZE来声明在一个进程中select所能操作的文件描述符的最大数目。一般情况下被定义为1024.一个整数占4个 字节,既32位,那么就是用包含32个元素的整数数组来表示文件描述符集。我们可以在头文件中修改这个值来改变select使用的文件描述符集的大小,但 是需要注意的是:必须重新编译内核才能使修改后的值有效。 如果我们对其中的个一不感兴趣的话,可以设置为空指针。如果我们把三个都设为空指针,就实现了一个比sleep更准确的定时器。 注
您可能关注的文档
最近下载
- 消防工程质量监理质量评估报告.docx VIP
- JTT 1516-2024 公路工程脚手架与支架施工安全技术规程.docx VIP
- 咨询服务流程与方法.docx VIP
- 乳制品的生产企业应急预案终稿.pdf
- 北师大版七年级数学下学期期中易错精选50题(解析版)2022-2023学年七年级数学下册重难点专题提优训练(北师大版).docx VIP
- 2023-2024年暨南大学352口腔综合考研真题.pdf VIP
- 110千伏及以下配电网规划技术指导原则(2024年).doc VIP
- 药品常用知识(共18张PPT).pptx VIP
- 医疗质量管理课件.pptx VIP
- 管理学原理配套教材电子课件(完整版).pptx
文档评论(0)