- 基本步骤:
- 步骤1:初始化文件描述符集合:
- 创建
fd_set
类型的变量,用于存储需要监听的文件描述符集合。例如,fd_set read_fds
用于监听可读事件,fd_set write_fds
用于监听可写事件。可以使用FD_ZERO
宏来清空这些集合。
- 步骤2:添加文件描述符到集合中:
- 使用
FD_SET
宏将需要监听的套接字添加到read_fds
集合(为了监听可读事件),将需要监听的文件描述符添加到write_fds
集合(为了监听可写事件)。
- 步骤3:确定最大文件描述符值:
- 找出需要监听的所有文件描述符中的最大值,记为
maxfd
。这个值将作为select
函数的第一个参数。
- 步骤4:调用select函数:
- 使用
select
函数进行多路复用监听。select
函数会阻塞等待,直到有文件描述符就绪(可读或可写),或者超时。
- 步骤5:检查就绪的文件描述符:
select
函数返回后,使用FD_ISSET
宏检查read_fds
和write_fds
集合中哪些文件描述符就绪,从而执行相应的处理逻辑。
- 代码框架:
#include <sys/select.h>
#include <sys/socket.h>
#include <stdio.h>
int main() {
int sockfd; // 套接字
int filedes; // 文件描述符
fd_set read_fds, write_fds;
FD_ZERO(&read_fds);
FD_ZERO(&write_fds);
// 假设已经初始化好sockfd和filedes
FD_SET(sockfd, &read_fds);
FD_SET(filedes, &write_fds);
int maxfd = sockfd > filedes? sockfd : filedes;
select(maxfd + 1, &read_fds, &write_fds, NULL, NULL);
if (FD_ISSET(sockfd, &read_fds)) {
// 处理套接字可读事件
}
if (FD_ISSET(filedes, &write_fds)) {
// 处理文件描述符可写事件
}
return 0;
}