转:select()函数以及FD_ZEROFD_SETFD_CLRFD_ISSET
Posted killer_xc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转:select()函数以及FD_ZEROFD_SETFD_CLRFD_ISSET相关的知识,希望对你有一定的参考价值。
select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型:
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout);
所在的头文件为:#include <sys/time.h> 和#include <unistd.h> 先对函数中的参数做一个简单的介绍。参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。 对于fd_set类型通过下面四个宏来操作: 过去。。。。。。好长一大段哦,为了保证大家的注意力,我决定将这一大段长长的对过去情况的介绍去掉,直接寻找正题,保持目标的关注度啊。现在,UNIX系统通常会在头文件<sys/select.h>中定义常量FD_SETSIZE,它是数据类型fd_set的描述字数量,其值通常是1024,这样就能表示<1024的fd。 好了在研究了一番关于fd_set的信息之后,再回到对select函数的理解上来吧。 功能:测试指定的fd可读?可写?有异常条件待处理? 对于select函数的功能简单的说就是对文件fd做一个测试。测试结果有三种可能:
返回值:返回对应位仍然为1的fd的总数。注意啦:只有那些可读,可写以及有异常条件待处理的fd位仍然为1。否则为0哦。举个例子,比如recv(), 在没有数据到来调用它的时候,你的线程将被阻塞,如果数据一直不来,你的线程就要阻塞很久.这样显然不好。所以采用select来查看套节字是否可读(也就是是否有数据读了) 。 理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。则1字节长的fd_set最大可以对应8个fd。 (3)若再加入fd=2,fd=1,则set变为0001,0011
(2)可以有效突破select可监控的文件描述符上限。
以下是一个测试单个文件描述字可读性的例子: |
这是转载来并且经过修剪的文章,出处为:http://hi.baidu.com/
以上是关于转:select()函数以及FD_ZEROFD_SETFD_CLRFD_ISSET的主要内容,如果未能解决你的问题,请参考以下文章
转 实例具体解释DJANGO的 SELECT_RELATED 和 PREFETCH_RELATED 函数对 QUERYSET 查询的优化
MySQL 使用客户端以及SELECT 方式查看 BLOB 类型字段内容总结
转 实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化