目录
概述
在Linux中,select
是一个经典的IO多路复用函数,用于监控多个文件描述符(file descriptors)的状态变化(如可读、可写或异常)。它允许程序同时等待多个文件描述符,并在其中任何一个文件描述符就绪时返回。
函数原型
#include <sys/select.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
参数说明:
-
nfds
:-
需要监控的文件描述符的最大值加 1。
-
例如,监控的文件描述符是 0、1、2,则
nfds
应为 3。
-
-
readfds
:-
指向一个
fd_set
类型的文件描述符集合,用于监控是否有数据可读。 -
如果为
NULL
,则表示不监控读事件。
-
-
writefds
:-
指向一个
fd_set
类型的文件描述符集合,用于监控是否可写。 -
如果为
NULL
,则表示不监控写事件。
-
-
exceptfds
:-
指向一个
fd_set
类型的文件描述符集合,用于监控是否有异常事件。 -
如果为
NULL
,则表示不监控异常事件。
-
-
timeout
:-
指向
struct timeval
结构体,用于设置超时时间。 -
如果为
NULL
,则表示阻塞等待,直到有文件描述符就绪。 -
如果设置为 0,则表示非阻塞,立即返回。
-
返回值:
-
成功:返回就绪的文件描述符的总数。
-
超时:返回 0。
-
错误:返回 -1,并设置
errno
。
fd_set
相关操作函数
fd_set
是一个文件描述符集合,通常通过以下宏来操作:
-
FD_ZERO(fd_set *set)
:清空集合。 -
FD_SET(int fd, fd_set *set)
:将文件描述符fd
添加到集合中。 -
FD_CLR(int fd, fd_set *set)
:将文件描述符