linux下异步I/O模型

本文介绍了kqueue,一种BSD系统中的无锁异步I/O模型,用于监听filedescriptor上的事件并实现非阻塞通知。主要讲解了kqueue的基本用法、kevent函数以及其在内核事件管理中的作用。

kqueue

  • kqueue是一种无锁的、异步I / O模型,由4.4BSD系统发布,以替代Poll。它允许进程监听file descriptor(文件描述符)上的一系列事件,并在事件被触发时通知进程。

//生成一个内核事件队列,返回该队列的文件描述符
int kqueue(void);

//向内核事件队列注册事件
int kevent(int kq, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout);
/*
kq:内核事件队列
changelist:修改的内核事件列表
nchanges:修改的内核事件列表长度
eventlist:发生的内核事件数组
nevents:发生的内核事件数组长度
timeout:超时时间,NULL将阻塞
返回值:发生的事件数,0表示超时
*/
//描述内核事件的结构体
struct kevent { 
     uintptr_t ident;       	// 文件描述符
     short     filter;       	// 过滤器类型:EVFILT_READ(可读)、
     u_short   flags;        	// 事件描述:EV_ADD(添加事件)
     u_int     fflags;       	// 过滤器标识符
     intptr_t  data;         	// 过滤器数据 (需要关注)
     void      *udata;       	// 应用透传数据  
 };

//初始化struct kevent的宏
EV_SET(&kev, ident, filter, flags, fflags, data, udata);


int kq = kqueue();		 

struct kevent kev;
EV_SET(&kev, fd, EVFILT_READ, EV_ADD, );
// 将fd注册到 kq 中。注册的方法是通过 kevent() 将 eventlist 和 neventlist 置成 NULL 和 0 来达到的
kevent(kq,&kev,1,NULL,0,NULL);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值