select
- 基本参数:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
nfds
:监控的所有文件描述符中的最大值加1。
readfds
:指向可读文件描述符集合的指针。
writefds
:指向可写文件描述符集合的指针。
exceptfds
:指向异常文件描述符集合的指针。
timeout
:设置select等待的超时时间,如果为NULL
,则表示无限等待。
- 返回值含义:
- 大于0:表示就绪的文件描述符的数目。
- 等于0:表示超时,没有文件描述符就绪。
- 小于0:表示出错,同时
errno
被设置。
- 可监控文件描述符数量:受限于系统定义的
FD_SETSIZE
,通常为1024,不过可以通过修改宏定义重新编译内核来增大这个值,但不推荐这种方式,因为这会影响系统的可移植性。
poll
- 基本参数:
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
fds
:一个struct pollfd
类型的数组,每个元素包含要监控的文件描述符、监控的事件类型和返回的事件类型。struct pollfd
结构体定义如下:
struct pollfd {
int fd; /* 文件描述符 */
short events; /* 等待的事件 */
short revents; /* 实际发生的事件 */
};
nfds
:fds
数组中元素的个数。
timeout
:设置poll等待的超时时间,单位为毫秒。如果为-1,表示无限等待;如果为0,表示立即返回,不等待。
- 返回值含义:
- 大于0:表示就绪的文件描述符的数目。
- 等于0:表示超时,没有文件描述符就绪。
- 小于0:表示出错,同时
errno
被设置。
- 可监控文件描述符数量:理论上没有限制,只受限于系统资源(如内存)。它不像
select
那样有固定的描述符数量限制。
epoll
- 基本参数:
- epoll_create:
int epoll_create(int size);
,size
参数在Linux 2.6.8之后被忽略,但仍需传入一个大于0的值,用来告诉内核要监控的大致文件描述符数量。返回一个epoll实例的文件描述符。
- epoll_ctl:
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epfd
:epoll实例的文件描述符。
op
:操作类型,如EPOLL_CTL_ADD
(添加文件描述符)、EPOLL_CTL_MOD
(修改监控事件)、EPOLL_CTL_DEL
(删除文件描述符)。
fd
:要操作的文件描述符。
event
:指向struct epoll_event
结构体的指针,用于指定监控的事件和关联的数据。struct epoll_event
结构体定义如下:
struct epoll_event {
uint32_t events; /* 事件 */
epoll_data_t data; /* 用户数据 */
};
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
- epoll_wait:
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
epfd
:epoll实例的文件描述符。
events
:一个struct epoll_event
类型的数组,用来存放就绪的文件描述符及其事件。
maxevents
:events
数组的大小,即最多能返回多少个就绪的文件描述符。
timeout
:设置epoll_wait等待的超时时间,单位为毫秒。如果为-1,表示无限等待;如果为0,表示立即返回,不等待。
- 返回值含义:
- 大于0:表示就绪的文件描述符的数目,这些就绪的文件描述符的相关信息存放在
events
数组中。
- 等于0:表示超时,没有文件描述符就绪。
- 小于0:表示出错,同时
errno
被设置。
- 可监控文件描述符数量:理论上没有限制,只受限于系统资源(如内存)。它能高效地处理大量的文件描述符,适合处理高并发场景。