三日强势股

来源:互联网 发布:unix高级编程 编辑:程序博客网 时间:2024/04/29 14:11

关于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超时时间已到,没有可读或可写的,返回

 

 


原创粉丝点击