c select函数
1 |
/* 头文件: /* According to POSIX.1-2001 */ /* According to earlier standards */ 原型: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); int pselect(int nfds, fd_set *readfds, fd_set *writefds,
void FD_CLR(int fd, fd_set *set); 功能: connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。 可是使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。 参数: nfds是readfds、writefds和exceptfds文件描述符集合中最大的文件描述符+1. readfds和writefds是被监控是否可读写的文件描述符集合。 exceptfds不监控此文件描述符集合,错误异常? timeout是select等待I/O的最长时间,如果timeval结构体是0,那么select立即返回,如果timeout为null,select无限阻塞。 返回值: >0 就绪的文件描述符个数; =0 超时; -1 出错,errno被设置。
四个宏: FD_CLR将文件描述符从集合中删除; FD_ISSET判断文件描述符是否在集合中。 FD_SET将文件描述符加入集合; FD_ZERO清除集合; fd_set和timeval结构体: The time structures involved are defined in <sys/time.h> and look like struct timeval { struct timespec { */ |
总结:简而言之,select是为了在socket通信时实现非阻塞方式。