总结一下三个io复用函数
1.select int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout); 1)nfds为被监听文件描述符的总数,通常为个数+1 2)struct fd_set由定义来看__fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];包含一个整形数组,其中每个位代表着一个文件描述符,这代表了读文件描述符的集合。需要注意的是,监听文件描述符的最大数由fd_setsize决定,其最大值是1024。 3)代表写文件描述符的集合。 4)异常文件描述符的集合。 5)struct timeout结构 struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ }; 第一个成员为秒,第二个成员为微妙,可见提供到微妙的支持。如果该结构指定为null,则一直阻塞此函数直到有事件发生。 6)return:成功返回0,失败返回-1并置errno。 7)提供以下宏函数代替位的繁琐操作 #define FD_SET(fd,fdsetp) __FD_SET (fd,fdsetp) //将文件描述符置位,相当于加入到该集合当中。 #define FD_CLR(fd,fdsetp) __FD_CLR (fd,fdsetp) //清除该文件描述符上的位,相当于从集合中取出。 #define FD_ISSET(fd,fdsetp) __FD_ISSET (fd,fdsetp) //判断文件描述符是否在其中 #define FD_ZERO(fdsetp) __FD_ZERO (fdsetp) //将该文件描述符清零。 8)更要注意的是,在向内核注册事件,通知完该事件之后,一定要重新注册一遍,即fd_set需要重新FD_SET进文件描述符。因为只能监听3个事件,读写异常,所以限制较多。 2.poll int poll(struct pollfd *fds,nfds_t nfds,int timeout); 1)struct pollfd结构 int fd; /* file descriptor */ short events; /* requested events */ short revents; /* returned events */ }; 1.1)events是需要在该文件描述符上监听的事件,通常是下列宏的位掩码: POLLIN //该文件描述符有数据可读 |