使用 kqueue 在 FreeBSD 上开发高性能应用服务器
2010-05-21 00:00:00 来源:WEB开发网过滤器相关的数据值,请看 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 }
更多精彩
赞助商链接