我正在模拟kqueue的某个功能来处理我的Centos框中的事件(我正在从FreeBSD移植一些代码),但是我无法理解void *udata
中struct kevent
的目的}:
struct kevent {
uintptr_t ident; /* identifier for this event */
short filter; /* filter for event */
u_short flags; /* action flags for kqueue */
u_int fflags; /* filter flag value */
intptr_t data; /* filter data value */
void *udata; /* opaque user data identifier */
};
我已经尝试过搜索,但是我能找到的关于这个领域最长的文献形式是“通过内核传递的不透明的用户定义值。”哪个没有多大帮助。
任何人都可以清楚地向我解释这个领域是什么吗?什么人可以使用它?
答案 0 :(得分:2)
udata字段不变地传入和传出内核,并且是 没有以任何方式使用。该字段的用法完全是应用程序 依赖,并作为一种有效实施的方式提供 函数调度例程,或以其他方式添加应用程序标识符 到了kevent结构。
如需完整参考,请查看以下文件:
答案 1 :(得分:1)
swpd是正确的。我想补充一点,“用户数据”的概念广泛用于事件处理API以及调用者提供回调函数的API。用户数据(通常是void-pointer)将传回 verbatim 。
用户数据的另一个例子是(网络)cookie - 当网络服务器设置Set-Cookie标头时,它要求浏览器将内容发送回(在Cookie标头中)随后的每个请求。浏览器不会以任何方式解释cookie - 就像内核没有解释udata字段一样 - 只需将其发送回来。