主要使用的方法有三种:select、poll、epoll,这次介绍一下select。
select函数原形:
int select (int nfds, fd_set *readset, fd_set *writeset,
fd_set *exceptset, const struct timeval * timeout);
参数一:监控所有文件描述符集里最大文件描述符加1,因为此参数会告诉内核检测前多少个文件描述符的状态
参数二:监控有读数据到达文件描述符集合,传入传出参数
参数三:监控写数据到达文件描述符集合,传入传出参数
参数四:监控异常发生达文件描述符集合,如带外数据到达异常,传入传出参数
参数五:定时阻塞监控时间,一个指向timeval结构的指针,用于决定select等待I/o的最长时间。如果为空将一直等待。
timeval结构的定义:
struct timeval{
long tv_sec; // seconds(秒)
long tv_usec; // microseconds(微秒)
}
成功返回:所有监听集合中,满足条件的总数,也就是你监听的读、写、异常全部满足加起来的总数。
失败返回错误码
对文件集合的操作函数,fd_set(文件集合, 实现是一个位图)
void FD_CLR(int fd, fd_set *set); //把文件描述符集合里fd清0
int FD_ISSET(int fd, fd_set *set); //测试文件描述符集合里fd是否置1
void FD_SET(int fd, fd_set *set); //把文件描述符集合里fd位置置为1
void FD_ZERO(fd_set *set); //把文件描述符集合里所有位清0
select注意事项:select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数。