go实现Kqueue和IO复用

本文介绍了Kqueue,一种在Unix系统上的高效IO多路复用技术,特别适用于Mac上的即时编译调试。文章通过对比epoll,详细阐述了Kqueue的工作原理,并在Go语言环境下,展示了如何使用Kqueue实现一个简单的echo服务,该服务能够实时检测并处理标准输入和输出的就绪状态,确保数据的流畅传输。
摘要由CSDN通过智能技术生成

Kqueue背景

Kqueue是unix系统上高效的IO多路复用技术,关于IO多路复用的原理网上有很多优秀的理解,这里不再赘述。
常见的io复用有select、poll、epoll、kqueue等。其中epoll为Linux系统独有,kqueue则在众多unix系统中存在,我们这里选择Kqueue进行切入主要是方便mac上IDE即时编译调试,其原理与epoll类似。

Kqueue参数概览

go语言中kqueue相关代码位于syscall库中
event_tKevent()操作的最基本的事件结构。
kqueuefreebsd内核中的一个事件队列kernel queue
Kevent()是一个系统调用,也是kqueue的用户界面,是对kqueue进行添加,删除操作的用户态的界面。

接下来介绍event_t这个结构体成员和Kevent的参数

type Kevent_t struct {
   
	Ident  uint64	//该事件关联的描述符,常见的有socket fd,file fd, signal fd等
	Filter int16	//事件的类型,比如读事件EVFILT_READ,写事件EVFILT_WRITE,信号事件EVFILT_SIGNAL
	Flags  uint16	//事件的行为,也就是对kqueue的操作,下面介绍几个常用的
					//如EV_ADD:添加到kqueue中,EV_DELETE从kqueue中删除
					//EV_ONESHOT:一次性或事件,kevent返回后从kqueue中删除
					//EV_CLEAR:事件通知给用户后,事件的状态会重置,
	Fflags uint32
	Data   int64
	Udata  *byte	//用户指定的数据
}
func Kevent(kq int, 				//Kqueue返回的唯一参数值,标记着一个内核队列
			changes, 				//需要对kqueue进行修改的事件集合,kqueue通过此参数完成对事件的修改
			events []Kevent_t, 		//返回的已经就绪的事件列表
			timeout *Timespec) 		//超时控制,不指定事件表示一直等待事件发生,否则只等待一段时间
			(n int, err error) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值