2013-03-25 52 views
1

我模仿的kqueue來處理我的Centos箱事件的某些功能(我移植從FreeBSD的一些代碼),但我不理解的void *udatastruct kevent目的:struct kevent中的udata字段是什麼?

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

udata字段被傳入和傳出內核不變,並且不以任何方式使用 。該字段的使用完全依賴於應用程序,並且作爲有效實現功能調度例程的方式提供,或者以其他方式將應用程序標識符 添加到kevent結構中。

完整參考,請查看以下文件:

Kqueue: A generic and scalable event notification facility

+0

換句話說,我可以用它指向任何我想要的東西。 kevent()忽略該字段,並且它在活動事件內部保持不變。我是否正確理解這一點? – SidR 2013-03-25 05:35:42

+0

是的,你是對的。 – swpd 2013-03-25 05:39:43

+0

非常感謝這篇論文。非常豐富。 – SidR 2013-03-25 05:40:43

1

swpd是正確的。我只想補充一點,「用戶數據」的概念廣泛應用於事件處理API以及由調用者提供回調函數的API。用戶數據(通常是空白指針)傳回逐字。用戶數據的另一個例子是(網絡)cookie - 當一個網絡服務器設置了Set-Cookie頭部時,它要求瀏覽器將每個後續請求發送回去(在Cookie頭部)。瀏覽器不會以任何方式解釋cookie - 就像內核不解釋udata字段 - 只是將其發回。

相關問題