gpt4 book ai didi

c - 如何用 kevent() 替换 select() 以获得更高的性能?

转载 作者:太空狗 更新时间:2023-10-29 17:20:11 28 4
gpt4 key购买 nike

来自Kqueue Wikipedia Page :

Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道。因此,可以修改事件过滤器以及接收未决事件,同时每次主事件循环迭代仅使用对 kevent(2) 的单个系统调用。这与效率较低的较旧的传统轮询系统调用(例如 poll(2) 和 select(2))形成对比,尤其是在轮询大量文件描述符上的事件时

听起来不错。我的服务器以 FreeBSD 为目标,我正在处理大量的网络套接字 fd——对它们全部使用 select() 并确定从谁那里读取数据。我宁愿使用 kevent() 调用来获得更高的性能,因为这就是它的用途!

我读过 man page for kevent on FreeBSD here但这对我来说很神秘,我找不到很好的资源来解释它。使用 kevent 替换 select 的示例可以解决我的问题,也可以帮助我更好地了解如何使用 kevent()。

最佳答案

首先,创建新的kqueue:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com