SELECT 系统调用:
nfds是制定被监听的文件描述符的总数,通常被设置为最大文件描述符值+1(因为文件描述符从0开始);
readfds,writefds,execeptfds分别指向可读,可写,异常事件对应的文件描述符;
fd_set结构体:
fd_set结构体只有一个整形数组,该数组的每个元素的每个位存放一个文件描述符;
FD_SETSIZE是fd_set能容纳的文件描述符的总量,也是select能同时处理的文件描述符个数;
timeout参数是timeval的结构体指针;
timeval结构体如下:
如果tv_sec,tv_usec为0则select立即返回,timeout传值为NULL则一直阻塞;
select返回值:
成功时返回文件描述符的总量,超时时间内没有文件描述符就绪返回0,失败时返回-1;
pool系统调用:
fds是poolfd结构体指针;
nfds指定监听事件fds的大小;
timeout指定poll超时值,为-1时将永远阻塞,为0立即返回;
poll返回值:
成功时返回文件描述符的总量,超时时间内没有文件描述符就绪返回0,失败时返回-1;
epoll系统调用:
epoll用一组函数来操作,并且把用户关心的文件描述符上的事件放在内核事件表中,而不像select和poll每次调用都要传入文件描述符集或事件集;epoll需要一个描述符来唯一标识内核中的事件表;
创建该描述符:
size是时间表的大小;
event是结构体指针;
epoll_data共用体中使用最多的是fd;
epoll_ctl成功时返回0失败返回-1并设置errno;
epfd是那个创建的标识事件表的文件描述符
epoll_wait函数:
在一段超时时间内等待一组文件描述符上的事件;
epfd同上;events是一个结构体指针,用来存放epfd从事件表中复制的事件信息,该数组用来输出epoll_wait检测到的就绪事件;
select和poll的数组既传入用户注册的事件,又输出内核检测到的就绪事件;
maxevent指定监听事件的个数,必须大于0;
timeout超时时间;
三组IO复用函数的比较: