Select归纳总结

#include <sys/select.h>
#include <sys/time.h>
int select(int maxfdpl, fd_set *readset, fd_set *write, fd_set  *exceptset, const struct timeval *timeout);


返回值:该函数的返回值表示跨所有描述符集的已就绪的总位数。

如果在任何描述符就绪以前定时器到时,那么返回0。

返回-1表示出错(例如本函数被一个说捕获的信号中断)。


int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,指定的是描述符的个数而非 最大值,而描述符是从0开始的。头文件<sys/select.h>中定义的FD_SETSIZE常值是数据类型fd_set中的描述符总数,其值通常是1024。


readset、writeset、exceptset指定我们要让内核测试读、写和异常条件的描述符。如果对某一个的条件不感兴趣,就可以把它设为空指针。

   目前支持的异常条件只有两个:

(1)某个套接字的带外数据到达。

(2)某个已置为分组模式的伪终端存在可从其主端读取的控制状态信息。

对于 fd_set类型的变量我们所能做的就是声明一个变量,为变量赋一个同种类型变量的值,或者使用以下几个宏来控制它:

#include <sys/select.h>   
int FD_ZERO(int fd, fd_set *fdset);   //clear all bits in fdset*
int FD_CLR(int fd, fd_set *fdset);    //turn on the bit for fd in fdset
int FD_SET(int fd, fd_set *fd_set);   //turn off the bit for fd in fdset
int FD_ISSET(int fd, fd_set *fdset);  //is the bit for fd on in fdset


3 timeout:告知内核等待所指定描述符中的任何一个就绪可花多长时间

struct timeval{      
        long tv_sec;   /*秒 */
        long tv_usec;  /*微秒 */   
}

有三种情况:

    timeout == NULL  等待无限长的时间。等待可以被一个信号中断。当有一个描述符做好准备或者是捕获到一个信号时函数会返回。如果捕获到一个信号, select函数将返回 -1,并将变量 erro设为 EINTR。

    timeout->tv_sec == 0 &&timeout->tv_usec == 0 不等待,直接返回。加入描述符集的描述符都会被测试,并且返回满足要求的描述符的个数。这种方法通过轮询,无阻塞地获得了多个文件描述符状态。

    timeout->tv_sec !=0 ||timeout->tv_usec!= 0 等待指定的时间。当有描述符符合条件或者超过超时时间的话,函数返回。在超时时间即将用完但又没有描述符合条件的话,返回 0。对于第一种情况,等待也会被信号所中断。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值