MST

星途 面试题库

面试题:网络编程之select、poll、epoll接口基础

请简述select、poll、epoll这三种I/O多路复用机制编程接口的基本参数和返回值含义,并说明它们在可监控文件描述符数量上的差异。
17.3万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

select

  1. 基本参数
    • int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
    • nfds:监控的所有文件描述符中的最大值加1。
    • readfds:指向可读文件描述符集合的指针。
    • writefds:指向可写文件描述符集合的指针。
    • exceptfds:指向异常文件描述符集合的指针。
    • timeout:设置select等待的超时时间,如果为NULL,则表示无限等待。
  2. 返回值含义
    • 大于0:表示就绪的文件描述符的数目。
    • 等于0:表示超时,没有文件描述符就绪。
    • 小于0:表示出错,同时errno被设置。
  3. 可监控文件描述符数量:受限于系统定义的FD_SETSIZE,通常为1024,不过可以通过修改宏定义重新编译内核来增大这个值,但不推荐这种方式,因为这会影响系统的可移植性。

poll

  1. 基本参数
    • int poll(struct pollfd *fds, nfds_t nfds, int timeout);
    • fds:一个struct pollfd类型的数组,每个元素包含要监控的文件描述符、监控的事件类型和返回的事件类型。struct pollfd结构体定义如下:
struct pollfd {
    int fd;         /* 文件描述符 */
    short events;   /* 等待的事件 */
    short revents;  /* 实际发生的事件 */
};
  • nfdsfds数组中元素的个数。
  • timeout:设置poll等待的超时时间,单位为毫秒。如果为-1,表示无限等待;如果为0,表示立即返回,不等待。
  1. 返回值含义
    • 大于0:表示就绪的文件描述符的数目。
    • 等于0:表示超时,没有文件描述符就绪。
    • 小于0:表示出错,同时errno被设置。
  2. 可监控文件描述符数量:理论上没有限制,只受限于系统资源(如内存)。它不像select那样有固定的描述符数量限制。

epoll

  1. 基本参数
    • epoll_createint epoll_create(int size);size参数在Linux 2.6.8之后被忽略,但仍需传入一个大于0的值,用来告诉内核要监控的大致文件描述符数量。返回一个epoll实例的文件描述符。
    • epoll_ctlint 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_waitint epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
    • epfd:epoll实例的文件描述符。
    • events:一个struct epoll_event类型的数组,用来存放就绪的文件描述符及其事件。
    • maxeventsevents数组的大小,即最多能返回多少个就绪的文件描述符。
    • timeout:设置epoll_wait等待的超时时间,单位为毫秒。如果为-1,表示无限等待;如果为0,表示立即返回,不等待。
  1. 返回值含义
    • 大于0:表示就绪的文件描述符的数目,这些就绪的文件描述符的相关信息存放在events数组中。
    • 等于0:表示超时,没有文件描述符就绪。
    • 小于0:表示出错,同时errno被设置。
  2. 可监控文件描述符数量:理论上没有限制,只受限于系统资源(如内存)。它能高效地处理大量的文件描述符,适合处理高并发场景。