您的位置:首页 > 其它

select 函数 使用

2007-06-15 10:57 399 查看
告知内核等待某一或某些事件发生 而后唤醒进程 或超时返回
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *excepset,
const struct timeval *timeout); 返回准备好的描述符数量 超时返0错误-1
主要功能:对I/O读 写 异常的监控;定时功能

struct timeval{
long tv_sec; 秒
long tv_usec; 毫秒
}; //可以作为定时器存在,也可以用来做sleep函数的高精版
1.该参数用以指明等待的时间:
a.永远等待 设置NULL指针
b.不等待立即返回 2个元素都设为0
c.等待一定时间 具体设置之
2.并不十分精确 最大精度10ms(系统约束) 但强于sleep()的1s
3.因为有const修饰符 所以该值不会被修改 若要计算时间2次在select前后调用时间函数求差

readset writeset excepset用以标示我们需要内核进行检测读写错误的描述符
1.excepset只有两种情况 一个是out-of-band 另一个书上没详细说
2.用以组整数数组来标识 每一位对应一个描述符 如:array[0]指示0~31个描述符

常用4个宏进行操作
void FD_ZERO(fd_set *fdset); 清除所有位
void FD_SET(int fd, fd_set *fdset); 设置位
void FD_CLR(int fd, fd_set *fdset); 关闭位
void FD_ISSET(int fd, fd_set *fdset); 查询该位是否设置
3.任何一个XXXset设为NULL表示对该状态不关心 全NULL可以代替sleep()使用
4.value-result参数 送时表明哪些描述符需要检测 返回时表明哪些描述符准备完毕

maxfdp1意思是最大描述符号加1
FD_SETSIZE定义fd_set描述符数量 但通常过大所以用这个参数减小系统负担
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: