select、poll、epoll都是linux下的I/O复用系统调用。它们都能监听多个文件描述符,等待由timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件发生时返回,返回值就是就绪的文件描述符的数量。返回0表示没有事件发生。下面来讲讲三个函数的不同之处
一、事件集
select:
- select的参数类型没有将文件描述符(fd)和事件进行一个绑定,因此在传参部分需要三个参数分别对应可读、可写、异常事件
缺点:
- 只能处理可读、可写以及异常等事件,所以可读、可写以及异常等事件不能处理更多类型的时间;
- select函数会使得内核直接对fd_set进行修改,所以在下一次select的时候需要重置fd_set;
- 每次select都会返回注册了的事件集合(包括就绪的和没有就绪的),应用程序索引就绪时间的时间复杂度为O(n);
poll:
- poll对select进行了改进,poll的参数pollfd将文件描述符(fd)和事件统一描述;
- poll函数使得内核每次只对pollfd中的revents成员进行修改,所以不需要每次使用的时候都重置pollfd;