程序猿通过调用这个函数可以委托内核帮助我们检测若干个文件描述符的状态,其实就是检测这些文件描述符对应的读写缓冲区的状态:
#include <sys/select.h
struct timeval { //进行初始化
time_t tv_sec; /* seconds */
suseconds_t tv_usec; //一般为0 /* microseconds */
};
int select(int **nfds**, fd_set ***readfds**, fd_set ***writefds**,
fd_set ***exceptfds**, struct timeval * **timeout**);
timeout:超时时长,用来强制解除select()函数的阻塞的
NULL:函数检测不到就绪的文件描述符会一直阻塞。
等待固定时长(秒):函数检测不到就绪的文件描述符,在**指定时长之后强制解除阻塞**,函数返回0
不等待:函数不会阻塞,直接将该参数对应的结构体初始化为0即可。
函数返回值:
大于0:成功,返回集合中已就绪的文件描述符的总个数
等于-1:函数调用失败
等于0:超时,没有检测到就绪的文件描述符
另外初始化fd_set类型的参数还需要使用相关的一些列操作函数,具体如下:
// 将文件描述符fd从set集合中**删除** == 将fd对应的标志位设置为0
void FD_CLR(int fd, fd_set *set);
// 判断文件描述符fd**是否在set集合中** == 读一下fd对应的标志位到底是0还是1
int FD_ISSET(int fd, fd_set *set);
// 将文件描述符fd**添加到set集合中** == 将fd对应的标志位设置为1
void FD_SET(int fd, fd_set *set);
// 将set集合中, 所有文件文件描述符对应的**标志位设置为0**, 集合中没有添加任何文件描述符
void FD_ZERO(fd_set *set);
poll的机制与select类似,与select在本质上没有多大差别
linux 内核实现IO多路转接/复用(IO multiplexing)的一个实现
IO多路转接的意思是在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效。