I/O 多路复用:`select`、`poll`、`epoll` 和 `kqueue` 的区别与示例

I/O 多路复用是指在一个线程内同时监控多个文件描述符(File Descriptor, FD),以便高效地处理多个 I/O 事件。在 UNIX/Linux 和 BSD 系统中,selectpollepollkqueue 都是实现 I/O 多路复用的系统调用。它们各有特点,适合不同的应用场景。本文将详细介绍它们的用法、优缺点,并附上相应的代码示例。
在这里插入图片描述

1. select

概述

select 是最早的 I/O 多路复用系统调用之一,广泛支持于各类操作系统中。它允许程序同时监视多个文件描述符,但有最大数量的限制(通常是 1024 个文件描述符)。

优点

  • 简单,适用性广泛。
  • 支持几乎所有 UNIX 类操作系统。

缺点

  • 文件描述符数量有限制。
  • 每次调用都需要重新设置文件描述符集合,效率较低。

使用示例

#include <stdio.h>
#include <stdlib.h>
#include <sys/select.h>
#include <unistd.h>int main() {fd_set readfds;struct timeval timeout;int ret;// 初始化文件描述符集合FD_ZERO(&readfds);FD_SET(STDIN_FILENO, &readfds);// 设置超时时间timeout.tv_sec = 5;timeout.tv_usec = 0;printf("Waiting for input, timeout in 5 seconds...\n");// 调用 select 函数,监控文件描述符ret = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &timeout);if (ret == -1) {perror("select");exit(EXIT_FAILURE);} else if (ret == 0) {printf("Timeout occurred! No data after 5 seconds.\n");} else {if (FD_ISSET(STDIN_FILENO, &readfds)) {char buffer[1024];read(STDIN_FILENO, buffer, sizeof(buffer));printf("Data read: %s\n", buffer);}}return 0;
}

解释

在上述代码中,我们使用 select 函数监听标准输入 (STDIN_FILENO) 的可读性。如果用户在 5 秒内没有输入,程序会超时并退出。

2. poll

概述

poll 作为 select 的改进版本,消除了文件描述符数量的限制。它通过一个 pollfd 数组来管理多个文件描述符,解决了 select 的一些局限性。

优点

  • 没有文件描述符数量限制。
  • API 比较简洁,避免了 select 需要重置文件描述符集合的问题。

缺点

  • select 一样,每次调用仍需遍历整个文件描述符集合。

使用示例

#include <stdio.h>
#include <stdlib.h>
#include <poll.h>
#include <unistd.h>int main() {struct pollfd fds[1];int ret;// 设置文件描述符和事件fds[0].fd = STDIN_FILENO;fds[0].events = POLLIN;printf("Waiting for input, timeout in 5 seconds...\n");// 调用 poll 函数,设置 5 秒超时ret = poll(fds, 1, 5000);if (ret == -1) {perror("poll");exit(EXIT_FAILURE);} else if (ret == 0) {printf("Timeout occurred! No data after 5 seconds.\n");} else {if (fds[0].revents & POLLIN) {char buffer[1024];read(STDIN_FILENO, buffer, sizeof(buffer));printf("Data read: %s\n", buffer);}}return 0;
}

解释

这里的代码使用 poll 来监控标准输入的可读性。与 select 类似,它设置了一个 5 秒的超时时间,但使用 poll 可以处理更多的文件描述符。

3. epoll

概述

epoll 是 Linux 特有的系统调用,它专门为处理大量文件描述符而设计,性能远优于 selectpollepoll 使用一个事件通知机制,避免了每次调用时遍历整个文件描述符集合。

优点

  • 高效,适合处理大量文件描述符。
  • 不需要每次遍历整个文件描述符集合。

缺点

  • 仅支持 Linux 系统。

使用示例

#include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <unistd.h>int main() {int epfd = epoll_create1(0);struct epoll_event event, events[1];int ret;if (epfd == -1) {perror("epoll_create1");exit(EXIT_FAILURE);}// 设置事件event.events = EPOLLIN;event.data.fd = STDIN_FILENO;if (epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event) == -1) {perror("epoll_ctl");exit(EXIT_FAILURE);}printf("Waiting for input, timeout in 5 seconds...\n");// 调用 epoll_wait,等待事件ret = epoll_wait(epfd, events, 1, 5000);if (ret == -1) {perror("epoll_wait");exit(EXIT_FAILURE);} else if (ret == 0) {printf("Timeout occurred! No data after 5 seconds.\n");} else {if (events[0].data.fd == STDIN_FILENO) {char buffer[1024];read(STDIN_FILENO, buffer, sizeof(buffer));printf("Data read: %s\n", buffer);}}close(epfd);return 0;
}

解释

在这个示例中,我们使用 epoll 来监控标准输入。epoll_create1 创建了一个 epoll 实例,随后通过 epoll_ctl 添加文件描述符。epoll_wait 用来等待事件发生,效率远高于 selectpoll

4. kqueue

概述

kqueue 是 BSD 系统(包括 macOS)中的高效 I/O 事件通知机制。与 epoll 类似,kqueue 使用事件通知的机制来避免每次遍历整个文件描述符集合。

优点

  • 高效,适合处理大量 I/O 事件。
  • 支持 BSD 系统。

缺点

  • 仅支持 BSD 系统(包括 macOS)。

使用示例

#include <stdio.h>
#include <stdlib.h>
#include <sys/event.h>
#include <sys/time.h>
#include <unistd.h>int main() {int kq = kqueue();struct kevent change, event;int ret;if (kq == -1) {perror("kqueue");exit(EXIT_FAILURE);}// 设置事件EV_SET(&change, STDIN_FILENO, EVFILT_READ, EV_ADD, 0, 0, NULL);printf("Waiting for input, timeout in 5 seconds...\n");// 调用 kevent,设置 5 秒超时struct timespec timeout = {5, 0};ret = kevent(kq, &change, 1, &event, 1, &timeout);if (ret == -1) {perror("kevent");exit(EXIT_FAILURE);} else if (ret == 0) {printf("Timeout occurred! No data after 5 seconds.\n");} else {if (event.ident == STDIN_FILENO) {char buffer[1024];read(STDIN_FILENO, buffer, sizeof(buffer));printf("Data read: %s\n", buffer);}}close(kq);return 0;
}

解释

在 BSD 系统中,kqueue 提供了一种高效的 I/O 事件通知机制。该代码监控标准输入,超时时间为 5 秒,使用 kevent 等待事件发生。

5. 总结

特性selectpollepollkqueue
支持的平台Unix/Linux/BSDUnix/Linux/BSDLinuxBSD/macOS
文件描述符限制有限制(1024)无限制无限制无限制
效率较低较低
扩展性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/52805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-input设置type=‘number‘和v-model.number的区别

el-input设置typenumber’与设置.number修饰符的区别 1. 设置type‘number’ 使用el-input时想收集数字类型的数据&#xff0c;我们首先会想到typenumber&#xff0c;设置完type为number时会限制我们输入的内容只能为数字&#xff0c;不能为字符/汉字等非数字类型的数值&…

性能诊断的方法(五):架构和业务诊断

关于性能诊断的方法&#xff0c;我们可以按照“问题现象—直接原因—问题根源”这样一个思路去归纳。我们先从问题的现象去入手&#xff0c;包括时间的分析、资源的分析和异常信息的分析。接下来再去分析产生问题现象的直接原因是什么&#xff0c;这里我们归纳了自上而下的资源…

外观模式详解:如何为复杂系统构建简洁的接口

&#x1f3af; 设计模式专栏&#xff0c;持续更新中 欢迎订阅&#xff1a;JAVA实现设计模式 &#x1f6e0;️ 希望小伙伴们一键三连&#xff0c;有问题私信都会回复&#xff0c;或者在评论区直接发言 外观模式 外观模式&#xff08;Facade Pattern&#xff09;为子系统中的一组…

linux系统安装miniconda3

一、下载minconda3 下载地址&#xff1a;https://docs.conda.io/en/latest/miniconda.html 一般国内访问比较困难&#xff0c;可到清华软件镜像站 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 需要特别注意自己的下载版本和自己的…

初识爬虫2

requests学习&#xff1a; 小技巧&#xff0c;如果你用的也是pycharm&#xff0c;对于控制台输出页面因为数据很长一行&#xff0c;不方便进行查看&#xff0c; 可以让它自动换行&#xff1a; 1.requests文档阅读学习链接&#xff1a;快速上手 — Requests 2.18.1 文档 需掌…

【运维监控】Prometheus+grafana监控zookeeper运行情况

运维监控系列文章入口&#xff1a;【运维监控】系列文章汇总索引 文章目录 一、prometheus二、grafana三、prometheus集成grafana监控zookeeper1、修改zookeeper配置2、修改prometheus配置3、导入grafana模板4、验证 本示例通过zookeeper自带的监控信息暴露出来&#xff0c;然后…

基于imx6ull平台opencv的图像采集和显示屏LCD显示功能(带Qt界面)

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 验证功能一、概述 本文档是针对imx6ull平台opencv的图像采集和显示屏LCD显示功能,创建Qt工程,在工程里面通过点击按钮,实现opencv通过摄像头采集视频图像,将采集的视频图像送给显示屏LCD进…

LabVIEW编程快速提升的技术

在LabVIEW程序员的成长过程中&#xff0c;很多技术和概念看似简单、常用&#xff0c;但真正掌握并能熟练运用&#xff0c;往往需要踏踏实实的实践与积累。没有什么是能够一蹴而就的&#xff0c;唯有通过不断的专注与深入&#xff0c;才能获得显著的提升。要想在LabVIEW开发上取…

SSM框架学习(三、MyBatis实践:提高持久层数据处理效率)

目录 一、Mybatis简介 1.简介 2.持久层框架对比 3.快速入门&#xff08;基于Mybatis3方式&#xff09; 4.ibatis方式的实现和原理 5.ibatis与mybatis之间的关系 二、Mybatis基本使用 1.向 sql 语句传参 &#xff08;1&#xff09;mybatis日志输出配置 &#xff08;2&…

为什么矩阵特征值之和等于主对角线元素之和,特征值乘积等于行列式值

首先给出特征值和特征向量的定义。 设A是n阶矩阵&#xff0c;如果数λ和n维非零向量x使关系式 Axλx &#xff08;1&#xff09; 成…

微信小程序使用canvas画图保存图片到手机相册

微信小程序要实现使用canvas绘制一个图&#xff0c;然后保存到手机相册 **最终效果&#xff1a;**实现生成以下图片 一、初始化canvas // wxml页面设置canvas标签 <canvas style"width: {{windowW}}px; height: {{windowH}}px;" disable-scrolltrue canvas-id&…

C++(2)之Linux多线程服务端编程总结

C之Linux多线程服务端编程读书笔记 Author: Once Day Date: 2023年1月31日/2024年8月23日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Linux实践…

C++:类与对象

一、面向对象编程 (一) 面向过程vs面向对象 面向过程&#xff08;Procedural-Oriented-Programming&#xff0c; POP&#xff09;和面向对象&#xff08;Object-Oriented-Programming&#xff0c;OOP&#xff09;&#xff0c;是两种典型的编程范式&#xff0c;通常是作为划分编…

频带宽度固定,如何突破数据速率的瓶颈?

目录 目录 引言 信道 频带宽度 信噪比 信噪比的重要性 影响信噪比的因素 码元 码元的特点&#xff1a; 码元与比特的关系&#xff1a; 码元的作用&#xff1a; 码元的类型&#xff1a; Question 类比解释&#xff1a; 技术解释&#xff1a; 引言 在现代通信系统中…

OpenAI o1:AI领域的“草莓”革命,华人科学家贡献卓越

最近&#xff0c;科技界的热门明星“草莓”频繁出现在大家的视线中。9月11号&#xff0c;The Information报道称&#xff1a;OpenAI计划在未来两周内推出一款更智能、更昂贵、更谨慎的AI模型&#xff01;网友们对此消息持怀疑态度&#xff0c;认为类似消息屡见不鲜&#xff0c;…

centos8构建nginx1.27.1+BoringSSL+http3+lua+openresty

需要接入http3&#xff0c;索性最新的nginx在构建一波&#xff0c;趟一遍坑 准备工作 1.环境命令安装 yum install GeoIP -y yum install GeoIP-devel -y yum install libmaxminddb-devel -y yum install -y patch wget zlib zlib-devel lftp gcc gcc-c make openssl-devel p…

Pikachu靶场之csrf

CSRF 跨站请求伪造 CSRF入门及靶场实战 - FreeBuf网络安全行业门户 攻击者伪造恶意链接&#xff0c;诱使用户点击&#xff0c;这个链接附带了用户的认证凭据Cookie、Session等&#xff0c;执行操作如转账。 因为带了cookie、session&#xff0c;服务器认为是用户的行为。借用…

待机模式中WKUP上升沿模拟开机与关机

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 待机模式 代码 wkup.h wkup.c main.c 使用注意 前言 建议先阅读下面的博客中待机模式部分。本博客主要分享代码-基于待机模式WKUP引脚的上升沿实现类似长按开机与关机的功能…

二维码的原理以及Java生成二维码【中间带图片】

一、什么是二维码&#xff1a; 二维码 &#xff08;2-dimensional bar code&#xff09;&#xff0c;是用某种特定的几何图形按一定规律在平面&#xff08;二维方向上&#xff09; 分布的黑白相间的图形记录数据符号信息的。 二、常用的码制 Data Matrix, Maxi Code, Aztec,…

看看智慧门诊银医通自助服务方案,如何化解医院患者跑难题

“看病三分钟&#xff0c;排队三小时”&#xff0c;这是许多患者在就医过程中的无奈吐槽。挂号队伍长如龙&#xff0c;看病流程繁琐复杂&#xff0c;缴费窗口人满为患&#xff0c;检查报告等待时间漫长…… 这些就医痛点&#xff0c;不仅让患者身心疲惫&#xff0c;也给医院的管…