系统提供select函数来实现多路复用输入/输出模型.
select的函数原型如下:
#include <sys/select.h>
int select(int nfds, fd_set *readfds,
fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);
// 用来清除描述词组set中相关fd 的位
int FD_ISSET(int fd, fd_set *set);
// 用来测试描述词组set中相关fd 的位是否为真
void FD_SET(int fd, fd_set *set);
// 用来设置描述词组set中相关fd的位
void FD_ZERO(fd_set *set);
// 用来清除描述词组set的全部位
timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。
常见的程序片段如下:
fs_set readset;
FD_SET(fd,&readset);
select(fd+1,&readset,NULL,NULL,NULL);
if(FD_ISSET(fd,readset)){……}
理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。则1字节长的fd_set最大可以对应8个fd.