select原型:
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
select函数可以使用各种套接字宏来控制IO。
FD_CLR(int fd, fd_set *set);
clear–将文件描述符从集合set中移除。
FD_ISSET(int fd, fd_set *set);
检测fd是否在集合内,是 返回真。
FD_SET(int fd, fd_set *set);
加入集合。
FD_ZERO(fd_set *set);
清理整个集合使其不含任何描述符。
select提供了一个结构体:fd_set.
通常为一个小于等于32位的描述符,由FD_SETSIZE决定。
使用select函数的过程一般是:
先调用宏FD_ZERO将指定的fd_set清零,然后调用宏FD_SET将需要测试的fd加入fd_set,接着调用函数select测试fd_set中的所有fd,最后用宏FD_ISSET检查某个fd在函数select调用后,相应位是否仍然为1。
select return值:
-1 select error
0 select time out
1 success
timeout 使用的结构体
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
and
struct timespec {
long tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
设定2.5秒
timeout.tv_sec = 2;
timeout.tv_usec = 500000;