WEB开发网
开发学院操作系统Linux/Unix 使用 kqueue 在 FreeBSD 上开发高性能应用服务器 阅读

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

 2010-05-21 00:00:00 来源:WEB开发网   
核心提示: 过滤器相关的数据值,请看 EVFILT_READ 和 EVFILT_WRITE 描述,使用 kqueue 在 FreeBSD 上开发高性能应用服务器(4), udata应用自定义数据,注册的时候传给 kernel,注册事件到 kqueue 清单 1. 注册事件73boolRegister(int

过滤器相关的数据值,请看 EVFILT_READ 和 EVFILT_WRITE 描述。

udata

应用自定义数据,注册的时候传给 kernel,kernel 不会改变此数据,当有事件通知时,此数据会跟着返回给应用。

EV_SET

 EV_SET(&kev, ident, filter, flags, fflags, data, udata); 

struct kevent 的初始化的辅助操作。

一个服务器示例

例子实现了一个只有较简单通信功能的但有性能保证的服务器。在下面各个清单中只写出关键性的代码,错误处理的代码未写出,完整的代码请参考附带的源码:kqueue.cpp。

注册事件到 kqueue

清单 1. 注册事件

 73 bool Register(int kq, int fd) 
 74 { 
 75   struct kevent changes[1]; 
 76   EV_SET(&changes[0], fd, EVFILT_READ, EV_ADD, 0, 0, NULL); 
 77 
 78   int ret = kevent(kq, changes, 1, NULL, 0, NULL); 
 81 
 82   return true; 
 83 } 
 
 Register 将 fd 注册到 kq 中。注册的方法是通过 kevent() 将 eventlist 和 neventlist 置成 NULL 和 0 来达到的。 

创建监听 socket 和 kqueue,等待内核事件通知

清单 2. 创建监听

 27 int main(int argc, char* argv[]) 
 28 { 
 29   listener_ = CreateListener(); 
 32 
 33   int kq = kqueue(); 
 34   if (!Register(kq, listener_)) 
 39 
 40   WaitEvent(kq); 
 41 
 42   return 0; 
 43 } 
 
 85 void WaitEvent(int kq) 
 86 { 
 87   struct kevent events[MAX_EVENT_COUNT]; 
 88   while (true) 
 89   { 
 90     int ret = kevent(kq, NULL, 0, events, MAX_EVENT_COUNT, NULL); 
 96 
 97     HandleEvent(kq, events, ret); 
 98   } 
 99 } 

上一页  1 2 3 4 5 6 7 8  下一页

Tags:使用 kqueue FreeBSD

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接