关于select函数的一点整理
【A.function】
int select(int n,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);
【B.synopsis】
等待描述符[包括socket,文件描述符,管道等]状态的改变,并返回活动的描述符个数;
如果返回零则表示已经超时[超时之前一直没有活动描述符]
【C.parameter】
n: 最大的文件描述符加1
readfds: 读文件描述符组[所有需要监控的读文件描述符的集合]
writefds: 写文件描述符组[所有需要监控的写文件描述符的集合]
exceptfds: 异常描述符组[需要监控的异常描述符句柄集合]
timeout: 超时时间[监控描述符,超过timeout,select返回0]
【D.return value】
>0: 已改变的文件描述符的个数
=0 超时
-1 错误,错误代码见errno
【E.description】
[parameter value]
readfds,writefds,exceptfds不用时可填写NULL,timeout设为NULL表示没有时间限制一直阻塞到描述符变动,timeout设为0表示select立即返回
[fd_set]
系统提供以下宏,宏绑定相关描述符成集合
系统提供fd_set数据结构,数组类型,每一元素绑定一文件句柄,select监控句柄集合,有变动后置相应位
FD_ZERO(fd_set *set); 用来清除描述词组set的全部位
FD_SET(int fd,fd_set*set); 用来设置描述词组set中相关fd的位
FD_CLR(inr fd,fd_set* set); 用来清除描述词组set中相关fd 的位
FD_ISSET(int fd,fd_set *set); 用来测试描述词组set中相关fd 的位是否为真,>0表示可读写
[Timeval]
timeout是timeval结构,
系统提供如下的timeval结构体
struct timeval
{
time_t tv_sec; //秒
time_t tv_usec; //微妙
};
select函数阻塞中,会改变timeout数值,等于零后,select直接返回
如果timeout为零,则select函数直接返回;
如果timeout为NULL,则select函数一直阻塞到有描述符可读或可写时返回,返回可读或可写的描述符个数
如果select函数设置不为零和NULL,则阻塞到最大时间timeout时候,即返回0
select函数返回:
1.timeout超时时间还没到,有可读或可写的描述符,则返回
2.timeout超时时间已到,没有可读或可写的,返回