- 浏览: 142403 次
文章分类
最新评论
kqueue 接口是从 FreeBSD 4.1 版引入的,它允许进程向内核注册描述所关注 kqueue 事件的事件过滤器。类似于 select,它也可以设置超时,此外,它还有异步 I/O、文件修改通知(例如文件被删除或修改时发出的通知)、进程跟踪(例如进程调用 exit 或 fork 时发出的通知)和信号处理功能。kqueue 接口包括如下 2 个函数和 1 个宏。
其中,kevent 函数需要使用 kqueue 函数返回的 kqueue 描述符来注册所关注的事件和确定是否有所关注的事件发生。其参数 changelist 和 nchanges 表示对所关注事件做出的更改,若无更改则分别为 NULL 和 0。kevent 函数会在 nchanges 不为 0 时执行 changelist 数组中所请求的每个事件过滤器更改。对于条件已经触发的事件(包括刚在 changelist 中增设的那些事件),则由 eventlist 参数返回,它指向一个由 nevents 个元素构成的 kevent 结构数组。eventlist 中返回的事件数目将作为函数返回值,0 表示发生超时。超时通过 timeout 参数设置,其处理类似 select:NULL 阻塞进程,非 0 值指定明确的超时值,0 值执行非阻塞事件检测。
在 kevent 结构中,flags 成员在调用时指定过滤器更改行为,在返回时额外给出条件,如下图所示。
filter 成员指定的过滤器类型如下图所示。
作为例子,这里将I/O 复用之select 函数一节中 str_cli 函数的 select 版本使用 kqueue 接口改下如下。
参考书籍:
1、《UNIX 网络编程卷1:套接字联网API》第 14 章——高级 I/O 函数。
#include <sys/types.h> #include <sys/event.h> #include <sys/time.h> int kqueue(void); int kevent(int kq, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); void EV_SET(struct kevent *kev, uintptr_t ident, short filter, u_short flags, u_int fflags, intptr_t data, void *udata); #include <sys/event.h> struct kevent{ uintptr_t ident; // identifier (e.g., file descriptor) short filter; // filter type (e.g., EVFILT_READ) u_short flags; // action flags (e.g., EV_ADD) u_int fflags; // filter-specific flags intptr_t data; // filter-specific data void *udata; // opaque user data };
其中,kevent 函数需要使用 kqueue 函数返回的 kqueue 描述符来注册所关注的事件和确定是否有所关注的事件发生。其参数 changelist 和 nchanges 表示对所关注事件做出的更改,若无更改则分别为 NULL 和 0。kevent 函数会在 nchanges 不为 0 时执行 changelist 数组中所请求的每个事件过滤器更改。对于条件已经触发的事件(包括刚在 changelist 中增设的那些事件),则由 eventlist 参数返回,它指向一个由 nevents 个元素构成的 kevent 结构数组。eventlist 中返回的事件数目将作为函数返回值,0 表示发生超时。超时通过 timeout 参数设置,其处理类似 select:NULL 阻塞进程,非 0 值指定明确的超时值,0 值执行非阻塞事件检测。
在 kevent 结构中,flags 成员在调用时指定过滤器更改行为,在返回时额外给出条件,如下图所示。
filter 成员指定的过滤器类型如下图所示。
作为例子,这里将I/O 复用之select 函数一节中 str_cli 函数的 select 版本使用 kqueue 接口改下如下。
void str_cli(FILE *fp, int sockfd){ struct stat st; int isfile = ((fstat(fileno(fp), &st) == 0) && (st.st_mode & S_IFMT) == S_IFREG); struct kevent kev[2]; EV_SET(&kev[0], fileno(fp), EVFILT_READ, EV_ADD, 0, 0, NULL); EV_SET(&kev[1], sockfd, EVFILT_READ, EV_ADD, 0, 0, NULL); int kq = kqueue(); struct timespec ts; ts.tv_sec = ts.tv_nsec = 0; kevent(kq, kev, 2, NULL, 0, &ts); int nev, i, n, stdineof = 0; char buf[MAXLINE]; for(;;){ nev = kevent(kq, NULL, 0, kev, 2, NULL); for(i=0; i<nev; i++){ if(kev[i].ident == sockfd){ // socket is readable if((n = read(sockfd, buf, MAXLINE)) == 0){ if(stdineof == 1) return; // normal termination else{ printf("str_cli: server terminated prematurely\n"); exit(2); } } write(fileno(stdout), buf, n); }else if(kev[i].ident == fileno(fp)){ // input is readable n = read(fileno(fp), buf, MAXLINE); if(n > 0) write(sockfd, buf, n); else if(n == 0 || (isfile && n == kev[i].data)){ stdineof = 1; shutdown(sockfd, SHUT_WR); // send FIN kev[i].flags = EV_DELETE; kevent(kq, &kev[i], 1, NULL, 0, &ts); // remove kevent } } } } }
参考书籍:
1、《UNIX 网络编程卷1:套接字联网API》第 14 章——高级 I/O 函数。
发表评论
-
Unix 域套接字与描述符的传递
2019-03-27 23:59 717在Unix 域套接字概述一节中介绍了什么是 U ... -
Unix 域套接字概述
2019-03-12 22:48 982Unix 域协议并不是一个实际的协议族,而是在 ... -
辅助数据
2019-02-28 00:40 693辅助数据(a ... -
recv/send 和 recvmsg/sendmsg 函数
2019-01-22 00:40 1585recv 和 send ... -
inetd 守护进程介绍
2019-01-09 21:51 1061在 4.3 BSD 系统之前,很多网络服务都是 ... -
主机名与 IP 地址的转换(续)
2018-12-25 00:37 960在主机名与 IP 地址的转换一节中提到的 ge ... -
主机名与 IP 地址的转换
2018-11-14 00:20 2335在网络编程中,尽管大部分情况下操作的都是 IP ... -
SCTP 事件通知
2018-02-08 03:49 996SCTP 提供了多种可用的通知,用户可经由这些通知追踪 ... -
SCTP 套接字选项
2018-02-04 09:35 1704在获取和设置套接 ... -
SCTP 套接字编程基础函数
2018-02-04 10:08 1062SCTP 服务器可以使 ... -
SCTP 套接字编程基础概念
2018-01-18 00:10 566SCTP 套接字分为一到一套接字和一到多套接字。提供一 ... -
UDP套接字编程基础
2018-01-14 10:37 576下图显示了使用 UDP 套接字编写客户/服务器程序时的 ... -
通用套接字选项
2018-01-02 00:46 555在获取和设置套接 ... -
获取和设置套接字选项
2017-12-29 08:21 445下面几种方法可用 ... -
I/O 复用之 poll 函数
2017-12-27 00:20 429poll 函数提供的功能与 select 类似,不过在 ... -
I/O 复用之select 函数
2017-12-12 00:32 519select 函数允许进 ... -
Unix 5 种 IO 模型概述
2017-11-19 01:44 308Unix 下有 5 种可用 ... -
套接字创建、连接和关闭函数
2017-08-13 17:16 671下图是一对 TCP 客户与服务器进程之间发生的一些典型 ... -
字节转换和填充函数
2017-08-06 01:09 433网络编程中,为保证发送协议栈和接收协议栈就如 32 位 ... -
IPv4 和 IPv6 的套接字地址结构
2017-08-01 21:03 742大多数套接字函数 ...
相关推荐
此外,这两种接口还存在一定的局限性,它们无法处理应用程序可能感兴趣的其他类型的事件,例如信号、文件系统的变更或异步I/O完成等。 为了解决这些问题,FreeBSD项目引入了一种名为Kqueue的通用且可扩展的事件通知...
源码分析会揭示如何初始化和操作这些IO复用接口,如何设置文件描述符的事件类型,以及如何处理接收到的事件。 总的来说,理解并掌握这些IO复用机制对于开发高性能、高并发的网络应用至关重要。不同的机制有各自的优...
`epoll` 是Linux内核提供的一种高级IO多路复用接口,它是在`poll` 和 `select` 之上发展起来的,具有更高的性能和更丰富的功能。`epoll` 使用“事件就绪”的模式,支持水平触发和边缘触发两种模式,用户可以通过`...
aLiLua 是一套基于 epoll/kqueue/Lua 构建的网络服务开发框架 aLiLua 使用 epoll 进行网络/文件IO事件读写,对Lua协程进行调度,其性能高效并且简单 Lua 语言就像 PHP 那么简单容易理解
epoll,kqueue,事件端口和wepoll的便携式接口。 支持平台: :Linux,Android :macOS,iOS,FreeBSD,NetBSD,OpenBSD,DragonFly BSD :illumos,Solaris :Windows 轮询是在单发模式下完成的,这意味着...
4. **高性能**:处理多媒体流需要高效的性能,ZLMediaKit可能采用了异步I/O模型,如epoll或Kqueue,以提高并发处理能力。 5. **动态扩展**:在高负载场景下,ZLMediaKit可能支持负载均衡和动态扩缩容,以应对大量...
它支持多种事件模型,如epoll、kqueue、poll等,可以在不同的操作系统上提供高效的事件通知机制。在我们的HTTP接口消息队列中,libevent将用于处理HTTP请求,为客户端提供服务。 二、HTTP+Redis实现消息队列 1. ...
libevent 是轻量级的开源高性能事件通知库,支持多种 I/O 多路复用技术,内部使用select、epoll、kqueue、IOCP等系统调用管理事件机制。 支持超时事件、持久事件, I/O事件,定时器和信号等事件,支持注册事件优先级...
总结来说,c-event-machine是一个用C语言编写的,利用操作系统提供的高级I/O接口的事件处理库。它专为Linux和FreeBSD设计,对于理解和实践网络编程,特别是事件驱动编程,具有很高的学习价值。然而,由于依赖特定的...
libco是微信后台大规模使用的c/c++协程库。 libco的特性 无需侵入业务逻辑,把多进程、多线程服务改造成协程服务,并发能力得到百倍提升;...基于epoll/kqueue实现的小而轻的网络框架,基于时间轮盘实现的高性能定时器;
- **事件驱动模型**:Swoole基于事件驱动模型,通过epoll(Linux)或kqueue(FreeBSD)等机制实现非阻塞I/O,提高服务器的并发性能。 - **协程(Coroutine)**:Swoole引入了协程机制,使得在PHP中可以实现轻量级...
在Linux系统中,可以使用inotify或kqueue这样的系统内核接口。本项目可能采用了这些接口之一,根据操作系统提供的方式去监听文件或目录的创建、删除、修改等事件。 实现C++文件监控通常包括以下步骤: 1. **初始化...
- **概述**:当客户端发起连接请求时,Nginx需要创建监听套接口(listening socket)和连接套接口(connection socket)。这些步骤是Nginx处理连接的基础。 - **创建监听套接口**:Nginx首先需要创建一个监听套接口...
编译库代码,编译脚本会判断OS支持哪种类型的事件机制(select、epoll或kqueue),然后条件编译相应代码,供上层使用的接口仍然是保持统一的(否则也不能所谓的跨平台了)。在linux redhat as 4 u 2 上编译相当...
编译库代码,编译脚本会判断OS支持哪种类型的事件机制(select、epoll或kqueue),然后条件编译相应代码,供上层使用的接口仍然是保持统一的(否则也不能所谓的跨平台了)。在linux redhat as 4 u 2 上编译相当...
这个库的核心功能是提供一个简洁的接口,使得开发者能够轻松地获取到运行中的进程的各种详细数据,并且还支持异步监听进程的创建和结束事件。在Swift开发中,这样的库是非常宝贵的,因为它可以极大地简化系统级编程...
编译库代码,编译脚本会判断OS支持哪种类型的事件机制(select、epoll或kqueue),然后条件编译相应代码,供上层使用的接口仍然是保持统一的(否则也不能所谓的跨平台了)。在linux redhat as 4 u 2 上编译相当...
它实现了由事件循环驱动的TCP / UDP /组播/ HTTP / HTTP2 / WebSocket /计时器的接口。 kuma在Linux / Windows / OSX / iOS / Android平台上支持epoll / poll / WSAPoll / IOCP / kqueue / select。产品特点支持...
此外,还将涉及异步I/O模型,如epoll和kqueue,以及多线程和多进程并发处理网络请求的策略。这部分内容对于Web服务器开发者和网络应用程序员来说尤为实用。 除了理论知识,实践操作也是学习的重要环节。书中会提供...
libco提供了一种可以高效处理I/O操作的并发模型,其核心机制是基于Linux系统调用如epoll/kqueue,这表明它特别适合于Unix-like系统的环境。epoll是Linux内核提供的一种高效的I/O事件通知机制,用于解决高并发服务中...