从Kqueue Wikipedia Page:
Kqueue在内核和用户域之间提供了有效的输入和输出事件管道。因此,可以在每次主事件循环迭代中仅使用对kevent(2)的单个系统调用时修改事件过滤器以及接收未决事件。这与效率较低的较旧的传统轮询系统调用(例如poll(2)和select(2))形成对比,尤其是在轮询大量文件描述符上的事件时
听起来不错。我将FreeBSD定位为服务器,并且正在处理大量的网络套接字fd-对它们全部使用select()并弄清楚谁可以读取数据。我宁愿使用kevent()调用来获得更高的性能,因为这就是它的作用!
我已经阅读了man page for kevent on FreeBSD here,但对我来说却很神秘,我找不到很好的资源来解释它。使用kevent替换select的示例可以解决我的问题,也可以帮助我更好地了解如何使用kevent()。
最佳答案
首先,创建新的队列:
int kq=kqueue();
现在在kq中注册您的fd:
struct kevent kev;
kev.ident=your_fd;
kev.flags=EV_ADD | EV_CLEAR;
kev.filter=EVFILT_READ;
kev.fflags=0;
kev.data=0;
kev.udata=&your_data;
int res=kevent(kq,&kev,1,0,0,0);
最后,等待数据到达您的套接字:
struct kevent res_kevs[5];
int res=kevent(kq,0,0,res_kevs,5,0);
返回后,
res_kevs[i].ident
将包含您套接字的描述符res_kevs[i].data
-准备读取的字节数。有关更多详细信息和功能,请参见man kevent。
关于c - 如何用kevent()替换select()以获得更高的性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5756402/