MST

星途 面试题库

面试题:网络编程中poll函数的工作原理

请详细阐述poll函数在网络编程中的工作原理,包括它的数据结构、如何监听文件描述符集合以及事件触发机制。
12.6万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

1. poll函数的数据结构

poll函数使用pollfd结构体数组来表示要监听的文件描述符集合。pollfd结构体定义如下:

struct pollfd {
    int fd;         /* 文件描述符 */
    short events;   /* 等待的事件 */
    short revents;  /* 发生的事件 */
};
  • fd:指定要监听的文件描述符。如果fd为负数,events会被忽略,revents会被清0。
  • events:指定该文件描述符上等待的事件,它是一系列事件标志的按位或,如POLLIN(数据可读)、POLLOUT(数据可写)、POLLERR(错误)等。
  • revents:由内核在函数返回时设置,指示该文件描述符上实际发生的事件,也是一系列事件标志的按位或。

2. 如何监听文件描述符集合

poll函数的原型为:

int poll(struct pollfd *fds, nfds_t nfds, int timeout);
  • fds:指向pollfd结构体数组的指针,该数组包含了要监听的所有文件描述符及其相关信息。
  • nfdsfds数组中元素的个数。
  • timeout:指定等待事件发生的超时时间,单位为毫秒。如果timeout为0,poll函数立即返回;如果timeout为-1,poll函数将无限期等待,直到有事件发生。

poll函数通过遍历pollfd结构体数组,对每个文件描述符进行监听。内核会检查每个文件描述符上是否发生了在events字段中指定的事件。如果有事件发生,内核会在对应的revents字段中设置相应的事件标志。

3. 事件触发机制

poll函数被调用时,内核开始检查pollfd数组中每个文件描述符的状态。如果在timeout时间内,某个文件描述符上发生了在events中指定的事件,poll函数将返回。返回值表示发生事件的文件描述符的个数,这些文件描述符的revents字段会被设置为实际发生的事件。

  • 如果返回值大于0,说明有文件描述符发生了事件。应用程序可以遍历pollfd数组,检查每个元素的revents字段,以确定具体是哪些文件描述符发生了什么事件。
  • 如果返回值为0,表示在timeout时间内没有任何文件描述符发生事件。
  • 如果返回值为-1,表示发生了错误,如errno可能被设置为EINTR(被信号中断)、EFAULTfds指针无效)等,应用程序需要根据errno进行相应处理。

poll函数采用水平触发(Level Triggered, LT)机制。在水平触发模式下,只要文件描述符对应的缓冲区还有未读数据(对于读事件)或者缓冲区还有空间可写(对于写事件),就会一直触发相应的事件。这意味着应用程序需要及时处理事件,以避免多次触发相同的事件。