面试题答案
一键面试poll机制相较于select机制在视频流传输场景下的优势
- 可监控文件描述符数量限制:
- select:select存在文件描述符数量限制,通常在1024左右(不同系统有所差异),这对于可能涉及大量连接的视频流传输场景不太友好,因为视频流传输可能同时与多个客户端建立连接,超过限制后无法有效监控更多文件描述符。
- poll:poll没有固定的文件描述符数量限制(理论上),它基于链表结构来管理文件描述符,更适合视频流传输中可能出现的大量连接场景。
- 数据结构和性能:
- select:select使用位图(fd_set)来表示文件描述符集合,每次调用select时都需要将整个文件描述符集合从用户空间复制到内核空间,并且在返回时也需要检查整个集合来确定哪些文件描述符有事件发生,随着文件描述符数量增多,性能开销较大。
- poll:poll使用pollfd结构体数组,每次调用poll只需将结构体数组传递给内核,内核在返回时会修改结构体中的revents字段来标识发生的事件,不需要像select那样每次都检查整个集合,在处理大量文件描述符时性能更优,适合视频流传输这种对实时性和性能要求较高的场景。
- 跨平台兼容性:
- select:select在不同操作系统上实现略有不同,在一些操作系统上可能存在兼容性问题,尤其是在处理一些特定平台的特性时。
- poll:poll的实现相对更统一,在跨平台开发中,尤其是在不同操作系统上进行视频流传输应用开发时,使用poll可以减少因平台差异带来的开发和维护成本。
poll机制在处理视频流传输时监控文件描述符可读可写状态的方式
- 初始化:
- 首先创建一个
pollfd
结构体数组,数组中的每个元素对应一个需要监控的文件描述符。例如:
struct pollfd fds[1024]; int nfds = 0; // 假设已经打开了视频流相关的文件描述符fd fds[nfds].fd = fd; fds[nfds].events = POLLIN | POLLOUT; // 监控可读和可写事件 nfds++;
- 首先创建一个
- 调用poll函数:
- 使用
poll
函数来监控这些文件描述符。poll
函数的原型为int poll(struct pollfd *fds, nfds_t nfds, int timeout);
,其中fds
是pollfd
结构体数组指针,nfds
是数组中元素的个数,timeout
是等待的超时时间(毫秒)。例如:
int ret = poll(fds, nfds, -1); // -1表示无限期等待,直到有事件发生 if (ret > 0) { // 有事件发生,遍历检查哪些文件描述符有事件 for (int i = 0; i < nfds; i++) { if (fds[i].revents & POLLIN) { // 文件描述符可读,例如可以读取视频数据 } if (fds[i].revents & POLLOUT) { // 文件描述符可写,例如可以发送视频数据 } } } else if (ret == 0) { // 超时,没有事件发生 } else { // poll调用出错 }
- 使用
通过上述方式,poll机制可以有效地监控视频流传输中文件描述符的可读可写状态,以实现高效的视频数据传输。