struct kevent中的udata字段是什么?

时间:2013-03-25 05:14:15

标签: freebsd kqueue

我正在模拟kqueue的某个功能来处理我的Centos框中的事件(我正在从FreeBSD移植一些代码),但是我无法理解void *udatastruct 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 */
     };

我已经尝试过搜索,但是我能找到的关于这个领域最长的文献形式是“通过内核传递的不透明的用户定义值。”哪个没有多大帮助。

任何人都可以清楚地向我解释这个领域是什么吗?什么人可以使用它?

2 个答案:

答案 0 :(得分:2)

  

udata字段不变地传入和传出内核,并且是   没有以任何方式使用。该字段的用法完全是应用程序   依赖,并作为一种有效实施的方式提供   函数调度例程,或以其他方式添加应用程序标识符   到了kevent结构。

如需完整参考,请查看以下文件:

Kqueue: A generic and scalable event notification facility

答案 1 :(得分:1)

swpd是正确的。我想补充一点,“用户数据”的概念广泛用于事件处理API以及调用者提供回调函数的API。用户数据(通常是void-pointer)将传回 verbatim

用户数据的另一个例子是(网络)cookie - 当网络服务器设置Set-Cookie标头时,它要求浏览器将内容发送回(在Cookie标头中)随后的每个请求。浏览器不会以任何方式解释cookie - 就像内核没有解释udata字段一样 - 只需将其发送回来。