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

  1. kevent 数据结构
  1. pair
  2. flags
  3. EV_SET()宏

2.kqueue()

3.kevent()

       a.timeout

4.总结

III.例子

       1.一个定时器例子

       2.一个原始的TCP客户端例子

IV.参考文献

 

简介

本文档的目的是向程序员介绍kqueue的使用方法,而不是提供一个完整而详尽的文档。

Kqueue为应用程序提供了一个标准的API,用于注册他们感兴趣的各种事件和条件,并以有效的方式通知他们。它的设计是可伸缩,灵活,可靠和准确的。

 

Kqueue API

kevent数据结构

kevent结构体是这样的:

struct kevent

{

uintptr_t  ident;   /* identifier for this event */ 事件标识

short  filter;     /* filter for event */ 监听事件的类型,如EVFILT_READ,EVFILT_WRITE,EVFILT_TIMER等

u_short  flags;   /* action flags for kqueue */事件操作类型,如EV_ADD,EV_ENABLE,EV_DELETE等

u_int  fflags;       /* filter flag value */

intptr_t  data;      /* filter data value */

void  *udata;       /* opaque user data identifier */可携带的任意用户数据

};

 

pair

kevent 由一对<ident, filter>进行标识。标识符ident可以是一个描述符 (文件、套接字、流)、进程ID或信号量, 这取决于我们要监视的内容。筛选器filter标识用于处理相应事件的内核筛选器。有一些预先定义的系统筛选器 (如 EVFILT_READ 或 EVFILT_WRITE),当有可进行读取或写入操作的数据时,可分别被触发。

例如,如果我们想在socket有数据可读取时收到通知,我们必须指定一个<sckfd,EVFILLE_READ>形式的kevent,其中sckfd是与套接字关联的描述符。如果我们监视一个进程的活动,我们需要一个<pid,EVFILT_PROC>元组。需要注意的是,一个kqueue只能有一个<ident,filter>相同的kevent。

 

flags

在设计好一个kevent之后,我们应该决定是否将它添加到我们的kqueue中。为此,我们通过设置flags成员为EV_ADD。我们也可以通过设置EV_DELETE或EV_DISABLE来删除或仅仅只是禁用一个已存在的kevent。

可以通过或运算将期望的值组合在一起。例如,EV_ADD|EV_ENABLE|EV_ONESHOT将被解释为“添加这个事件,使能它并且只在第一次发生时被触发,在用户将事件从kqueue中取出之后将其删除。”

反过来,如果希望检查一个kevent中某个flag是否被置位,我们可以通过将kevent.flag与期望的值进行“与运算”。例如:

if(myevent.flags & EV_ERROR)

{

       /*handle errors*/

}

 

EV_SET()宏

EV_SET()宏是为了便于初始化kevent结构体。我们暂时不祥述其余的kevent成员,相反我们先来看看当我们需要监视一个套接字是否有等待读取的数据的情况:

kevent ev;

EV_SET(&ev,sckfd,EVFILT_READ,EV_ADD,0,0,0);

如果我们要监视N个套接字的集合,我们应该这样写:

kevent ev[N];

int i;

for(i=0;i<N;i++)

{

       EV_SET(&ev[i],sckfd[i],EVFILE_READ,EV_ADD,0,0,0);

}

 

kqueue

kqueue包含了我们所有趣的事件。因此,首先,我们必须创建一个新的kqueue,我们使用下面的代码执行此操作:

int kq;

if((q=kqueue())= = -1)

{

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netty HttpsURLConnectionPool 的使用可以分为以下几个步骤: 1. 引入依赖:在项目的构建文件中引入Netty HttpsURLConnectionPool的依赖,例如Maven中的以下依赖: ```xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-handler</artifactId> <version>${netty.version}</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-codec-http</artifactId> <version>${netty.version}</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-codec-http2</artifactId> <version>${netty.version}</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-transport-native-epoll</artifactId> <version>${netty.version}</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-transport-native-kqueue</artifactId> <version>${netty.version}</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-common</artifactId> <version>${netty.version}</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-resolver-dns-native-macos</artifactId> <version>${netty.version}</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-boringssl-static</artifactId> <version>${netty.version}</version> </dependency> ``` 其中 `${netty.version}` 是Netty框架的版本号。 2. 创建连接池:使用Netty提供的`HttpClient`类创建一个连接池实例,例如: ```java EventLoopGroup workerGroup = new NioEventLoopGroup(); HttpClient httpClient = HttpClient.create() .eventLoopGroup(workerGroup) .secure(); ``` 这里使用了NIO的`NioEventLoopGroup`作为工作线程池,调用了`secure()`方法启用了HTTPS安全连接。 3. 发送请求:通过连接池发送请求,例如: ```java HttpResponse response = httpClient .request(HttpMethod.GET) .uri(uri) .response() .block(); ``` 这里使用了Netty提供的`HttpResponse`类来接收响应结果。 4. 关闭连接:使用完连接池后,需要调用`dispose()`方法关闭连接池,例如: ```java httpClient.dispose(); workerGroup.shutdownGracefully(); ``` 这里同时关闭了工作线程池。 综上所述,使用Netty HttpsURLConnectionPool连接池的过程比较简单,主要是创建连接池、发送请求和关闭连接池三个步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值