MST

星途 面试题库

面试题:C语言中如何利用select实现异步多路复用

在C语言环境下,描述使用select函数进行异步多路复用的基本步骤,假设需要监听一个套接字的可读事件和一个文件描述符的可写事件,给出相应代码框架(可省略错误处理部分)。
12.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 基本步骤
    • 步骤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_fdswrite_fds集合中哪些文件描述符就绪,从而执行相应的处理逻辑。
  2. 代码框架
#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;
}