kqueue介绍

高级 IO 模型之 kqueue 和 epoll 简介 任何一个程序都离不开 IO,有些是很明显的 IO,比如文件的读写,也有一些是不明显的 IO,比如网络数据的传输等。那么这些 IO 都有那些模式呢?我们在使用中应该如何选择呢?高级的 IO 模型 kqueue 和 epoll 是怎么工作的呢?一起来看看吧。 block IO 和 nonblocking IO 大家先来了解一下 IO 模型中最简单的两个模型:阻塞 IO 和非阻塞 IO。 比如我们有多个线程要从一个 Socket server 中读取数据,那么这个读取过程其实可以分成两... 阅读详情

转自 : http://ray.bsdart.org/archives/304.raymond

这篇文章我从第一次接触kqueue到目前的理解,一直放在我的mempad中,最近有朋友对kqueue的一些疑问,所以我就把这个发出来。

首先需要简单的说明几个概念, struct event, kevent()和kqueue。

struct event就是kevent()操作的最基本的事件结构。
kevent() 是一个系统调用syscall,而kqueue是freebsd内核中的一个事件队列kernel queue。
kevent()是kqueue的用户界面,是对kqueue进行添加,删除操作的用户态的界面。

// ==========================================================

下面就重点介绍一下struct event和kevent()这两个开发者必须要了解的参数和API。

1. struct event 结构体中主要成员介绍

  • ident     – 标记事件的描述符, socketfd, filefd, signal
  • filter      – 事件的类型, 读事件:EVFILT_READ, 写事件:EVFILT_WRITE, 信号:EVFILT_SIGNAL
  • flags     – 事件的行为, 对kqueue的操作:
  1. 添加到kqueue中:EV_ADD, 从kqueue中删除:EV_DELETE, 这两种是主要的行为
  2. 一次性事件:EV_ONESHOT, 此事件是或操作, 指定了该事件, kevent()返回后, 事件会从kqueue中删除
  3. 更新事件: EV_CLEAR,此事件是或操作, 手册上的解释是,当事件通知给用户后,事件的状态会被重置。可以用在类似于epoll的ET模式,也可以用在描述符有时会出错的情况。
  4. 其他事件: EOF事件:EV_EOF, 错误事件:EV_ERROR(返回值)
  • fflags    -
  • data     -
  • udata   – 用户指定的数据

2. kevent() 各参数的说明

  • kq               - kqueue() 返回的唯一描述符, 标记着一个内核队列
  • changes       – 需要对kqueue进行修改的事件集合, 此参数就是kevent()对目前kqueue中的事件的操作,比如删除kqueue中已经存在的事件,或者向kqueue中添加新的事件,也就是说,kevent()通过此参数对kqueue的修改
  • nchanges     – 需要修改的事件的个数
  • events         – kevent()会把所有事件存储在events中
  • nevents       – kevent()需要知道存储空间有多大, == 0 : kevent()会立即返回
  • timeout        – 超时控制, = NULL:kevent()会一直等到有关注的事件发生; != NULL:kevent()会等待指定的时间

// ==========================================================

有几点需要说明的是 :

1) 指定EV_ADD|EV_ONESHOT或者EV_DELETE|EV_ONESHOT的行为, kevent()返回后, 会把事件从kqueue中删除;

2) 当事件类型指定为EVFILT_SIGNAL的时候, struct event 中data会返回此时信号发生了多少次
3) 如果 nevents == 0, kevent()会立即返回, 不会理会timeout指定的超时时间, 这是一种直接注册事件的方法.


2023年美高赛HiMCM:A题蒲公英 思路 蒲公英,通常称为蒲公英,是一种原产于欧亚大陆的植物,现在在世界各地都可以找到[1]。这种植物很容易通过其亮黄色的花朵(图1)和独特的“马勃”种子头(图2)来识别。该头部的每颗种子都附着在一个类似降落伞的结构上,称为“冠毛”,有利于风的传播[2]。如果处于“马勃”阶段的单个蒲公英毗邻一块开阔的一公顷土地,请创建一个数学模型来预测蒲公英在 1、2、3、6 和 12个月内的传播情况。确保您的模型考虑了各种气候条件(例如温带、干旱和热带气候)对蒲公英生长的影响。2. 蒲 公英、人类和其他植物之间的关系很复杂。 阅读详情

相关推荐

卷积码和Turbo码

通信原理相关博文目录:目录我们常在移动通信中遇到的卷积码就是一种非分组码,卷积码和信号处理中的卷积运算有关系吗?是不是就是信号处理中的卷积运算,先看看编码器的编码原理再说:下面是一个比较实用的卷积码编码器:它有三个移位寄存器D0,D1,D2和三个模2加法器,以及一个旋转开关组成,编码前,先将各级移位寄存器清零:现在假设输入的信息码元是1101:当输入的第一个码元为1时,三个模2加法器计算的结果都为...

Reborn Lee 2万+

kqueue用法简介

1.什么是kqueue和IO复用 kueue是在UNIX上比较高效的IO复用技术。 所谓的IO复用,就是同时等待多个文件描述符就绪,以系统调用的形式提供。如果所有文件描述符都没有就绪的话,该系统调用阻塞,否则调用返回,允许用户进行后续的操作。 常见的IO复用技术有select, poll, epoll以及kqueue等等。其中epoll为Linux独占,而kqueue则在许多UNIX系统上存在,包括OS X(好吧,现在叫macOS了。。) 2. 使用概览 kueue在设计上是非常简洁的,在易用性上可能

2115

ESP32 WiFi自平衡小车硬件与PID控制实战

自平衡小车是典型的嵌入式实时反馈控制系统,其核心依赖姿态感知(如MPU6050)、电机驱动(如L298N)与闭环控制算法(如PID)的协同。系统通过IMU采集俯仰角,经互补滤波融合处理,再由PID控制器实时计算PWM输出,驱动直流电机产生恢复力矩;WiFi模块(ESP32内置)则提供远程遥控接口,实现AP模式下的Web指令交互。该架构兼具硬实时性(毫秒级采样与响应)与软实时性(HTTP服务),广泛应用于机器人教学、智能小车开发及边缘控制原型验证。本文围绕ESP32平台,详解传感器接口、驱动电路设计、PID抗

weixin_42509513的博客 391

深入分析 Kqueue & Kevent 原理及应用

转载者注:此篇转载内容是两篇博文的汇总,Kqueue用例部分增加csdn 《春夜喜雨》的demo用例分析,转者认为更容易让读者理解和认知。 常见IO复用技术对比 Wiki上的解释: kqueue 是一种可扩展的事件通知接口。2000 年 7 月发布的 FreeBSD 4.1 中首次引入了 kqueue,随后也被 NetBSD、OpenBSD、macOS 等操作系统支持。 kqueue 在内核与用户空间之间充当输入输出事件的管线。因此在事件循环的迭代中,进行一次 kevent(2) 系统调用不仅可以接收未决

weixin_38387929的博客 4475

开关变换器分析:大信号模型与小信号模型

是电力电子系统建模中的两类基本方法,分别用于描述系统在不同工作条件下的动态行为。它们的核心区别在于是否对变量进行线性化近似,以及适用的分析场景。

创新改变世界! 1907

DNF单机版搭建全攻略:从零开始到局域网联机(含常见问题解决)

本文提供详细的DNF单机版搭建指南,从环境配置到局域网联机设置,涵盖服务端安装、数据库配置及常见问题解决方案。适合新手和有经验的玩家,帮助快速搭建专属游戏服务器,重温经典游戏体验。

weixin_30832143的博客 847

高级IO模型之kqueue和epoll

文章目录简介block IO和nonblocking IOIO多路复用和selectpollepollkqueueepoll和kqueue的优势 简介 任何一个程序都离不开IO,有些是很明显的IO,比如文件的读写,也有一些是不明显的IO,比如网络数据的传输等。那么这些IO都有那些模式呢?我们在使用中应该如何选择呢?高级的IO模型kqueue和epoll是怎么工作的呢?一起来看看吧。 block IO和nonblocking IO 大家先来了解一下IO模型中最简单的两个模型:阻塞IO和非阻塞IO。 比如我们有

程序那些事 5702

告别蓝牙音质妥协:用ESP32和PCM5102搭建WiFi无损音频播放器(附完整代码)

本文详细介绍了如何利用ESP32微控制器和PCM5102 DAC芯片构建一套完整的WiFi无损音频流媒体系统,彻底摆脱蓝牙协议的音质束缚。从硬件原理到软件实现,包括核心器件选型、电路设计、I2S音频驱动实现以及系统优化方案,帮助音频发烧友实现高保真无线音频传输。

weixin_30733003的博客 542

freebsd高级I/O,kevent的资料很详细

高级I/O和进程资源 正如我们在前面章节 中看到的,程序可以同时打开多个文件描述符。这些文件描述符并不一定就是文件,还可以是fifo、pipe或者socket。于是,如何复用这些打开的描 述符就很重要了。例如,考虑一个简单的邮件阅读程序,比如pine。它显然应当允许用户在读写email的同时也能去检查是否有新邮件。这就意味着在任一 给定时刻都至少能够接收两个来源的输入:一个来源是用户,另

1444

MIKE21桥墩模拟实战:抠网格与构筑物法对比与选型指南

本文详细对比了MIKE21软件中抠网格法与构筑物法在桥墩模拟中的应用,包括操作步骤、适用场景及优缺点分析。通过实际案例数据展示两种方法的精度与效率差异,并提供选型决策树和常见问题解决方案,帮助工程师根据项目需求选择最优模拟方法。

weixin_42656416的博客 322

【华为OD机试真题E卷】300、 出租车计费 、靠谱的车 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

题目描述 >程序员小明打了一辆出租车去上班,出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大,出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常 >  比如: 1、23再多一块钱就变为25; 2、39再多一块钱变为50; 3、399再多一块钱变为500; >  小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋,给出计费表的表面读数,返回实际产生的费用

KJ.JK 4万+

使用 kqueue 在 FreeBSD 上开发高性能应用服务器

概述 kqueue 是 FreeBSD 上的一种的多路复用机制。它是针对传统的 select/poll 处理大量的文件描述符性能较低效而开发出来的。注册一批描述符到 kqueue 以后,当其中的描述符状态发生变化时,kqueue 将一次性通知应用程序哪些描述符可读、可写或出错了。 kqueue 支持多种类型的文件描述符,包括 socket、信号、定时器、AIO、VNODE、PIPE。本

robertzhouxh的专栏 695

ZYNQ PS-PL数据交互方式总结

一,中断 二,IO方式:MIO EMIO GPIO 三,BRAM或FIFO或EMIF (1)通过BRAM实现PL/PS之间交互 PS 的配置如下图所示。使能 M_AXI_GP0 口,将 FCLK_CLK0 设为 100MHz,使能 PL 至 PS 的中断。 AXI BRAM Controller IP 核连接 PS 的 M_AXI_GP0 口和 BRAM,完成 AXI 接口至 BRAM 接口的转换。 添加BRAM,将BRAM设置为双口RAM,将PORTA与AXI B...

wangjie36的博客 1万+

【Linux深入】Kqueue、IOCP与pselect的介绍

引入我在上一篇博文中讲了select、poll、epoll的区别,接下来我再介绍几个比较“冷门”的IO复用函数。1.select与pseletct的区别(1)函数int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);int pselect(int n,fd_se

白夜行 1889

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++网络编程之kqueue初步介绍

kqueue是BSD系统(如FreeBSD、macOS)提供的高效事件通知机制,支持文件描述符、文件系统、信号、定时器等多类事件的就绪监听。其核心接口kevent可批量注册与等待事件,减少系统调用。通过struct kevent定义事件,使用EV_SET宏初始化,支持水平触发与边沿触发(配合EV_CLEAR)。过滤器类型丰富,涵盖I/O、进程、文件变化等,适用于高性能网络服务与系统监控。但仅限于BSD及macOS平台,不适用于Linux或Windows。

fpcc的专栏 74

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

epoll 转kqueue的用法介绍和实例 实现跨平台Macos

网上关于kqueue的博客很少 我来补充一个例子echo 的例子 #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include<stdio.h> #include<arpa/inet.h> #include<sys/event.h> #include<sys

weixin_43862733的博客 3929

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

FreeBSD Kqueue的实现原理

kqueue/epoll 是两个网上出现频率比较高的关键字,epoll实现原理及源码网上已经有很多blog分析,关于 select/poll/epoll、kqueque的优缺点也不再解释。kqueue实现原理的文章网上资料比较少, 基本上就Jonathan Lemon的一篇论文, Jonathan Lemon也是Kqueue的发明者。文章链接:  Kqueue: A generi

mumumuwudi的博客 7603

kqueue的用法

The NetBSD Project ”Of course it runs NetBSD”   本文翻译自:http://wiki.netbsd.org/tutorials/kqueue_tutorial/   NetBSD Wiki/tutorials/kqueue tutorial 目录 I、简介 II、kqueue API kevent 数据结构 pair flags ...

Namcodream521的博客 4793

kqueue初次使用

kqueue看介绍,它所支持的event很多,文件句柄事件,信号,异步io事件,子进程状态事件,支持微秒的计时器事件等。 本次使用它的原因是,对于开发socket响应程序:一是它提供了类似epoll的功能,另一原因是它在MacOS上的支持。在MacOS下epoll是没有的,也只能使用kqueue来替代使用。

春夜喜雨的专栏 1477

FreeBSD 的kqueue

FreeBSD 的kqueue   http://bulk.fefe.de/scalable-networking.pdf 这是一篇介绍FreeBSD下的kqueue的好文,虽然kqueue这个模型开发总是出现bug,比如 FreeBSD kqueue Kernel拒绝服务攻击漏洞 等等,但是这在freebsd下,是一个可以同windows的iocp或者linux下的epoll相提并论

robertzhouxh的专栏 1742

go实现Kqueue和IO复用

Kqueue背景 Kqueue是unix系统上高效的IO多路复用技术,关于IO多路复用的原理网上有很多优秀的理解,这里不再赘述。 常见的io复用有select、poll、epoll、kqueue等。其中epoll为Linux系统独有,kqueue则在众多unix系统中存在,我们这里选择Kqueue进行切入主要是方便mac上IDE即时编译调试,其原理与epoll类似。 Kqueue参数概览 go语言中kqueue相关代码位于syscall库中 event_t是Kevent()操作的最基本的事件结构。 kque

hl4080的博客 1147

深入分析Kqueue & Kevent

文章目录为什么用Kqueue?什么是Kqueue?Kqueue怎么运行?一个示例 为什么用Kqueue? Wiki上的解释: kqueue 是一种可扩展的事件通知接口。2000 年 7 月发布的 FreeBSD 4.1 中首次引入了 kqueue,随后也被 NetBSD、OpenBSD、macOS 等操作系统支持。 kqueue 在内核与用户空间之间充当输入输出事件的管线。因此在事件循环的迭代中,进行一次 kevent(2) 系统调用不仅可以接收未决事件,还可以修改事件过滤器。 简单解释,Kqueue是

No_Game_No_Life_的博客 1544

DOUAudioStreamer 中kqueue的应用

DOUAudioStreamer是一个基于Core Audio的流式音频播放器,其中的DOUAudioEventLoop通过kqueue来控制音频的各种状态。 kqueue简介(详情请看官方manual) kqueue的功能类似epoll,多用于后台多个socket连接时的I/O复用,注册感兴趣的event,把描述符链表交给内核,然后就等待。一旦有某个或多个事件发生,内核就把 一个只...

184

kqueue演示样例

网络server通常都使用epoll进行异步IO处理,而开发人员通常使用mac,为了方便开发。我把自己的handy库移植到了mac平台上。移植过程中,网上竟然没有搜到kqueue的使用样例。让我吃惊不已。为了让大家不用像我一样再次花费大力气搞定kqueue,我整理了一个简单清晰可执行的kqueue样例,供大家參考。 kqueue一共同拥有几个函数: int ...

weixin_30498921的博客 93

【KQUEUE用法】

kqueue用法

u012632105的博客 141
上一篇: Mac&iOS Socket编程
下一篇: NSData 与 NSString,Byte数组,UIImage 的相互转换
我是一只懒虫
博客等级 码龄17年 147粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值