使用 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 }
- ››使用脚本恢复WinXP系统的用户登录密码
- ››使用phpMyadmin创建数据库及独立数据库帐号
- ››使用Zend Framework框架中的Zend_Mail模块发送邮件...
- ››使用cout标准输出如何控制小数点后位数
- ››使用nofollow标签做SEO的技巧
- ››使用 WebSphere Message Broker 的 WebSphere Tra...
- ››使用SQL Server事件探查器做应用程序的性能分析
- ››使用SQL Server事件探查器分析死锁原因
- ››使用纯文本文件打造WCF服务
- ››使用 Dojo 开发定制 Business Space 小部件,第 4...
- ››使用 ADDRESS 与 INDIRECT函数查询信息
- ››使用 COLUMN函数编制单元信息
更多精彩
赞助商链接