1

Centosボックス内のイベントを処理するためにkqueueの特定の機能をエミュレートしています(FreeBSDからいくつかのコードを移植しています)が、void *udatainの目的を理解できていません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 */
     };

検索してみましたが、このフィールドについて見つけた最長の文献は、「カーネルを変更せずに渡された不透明なユーザー定義値」です。これはあまり役に立ちません。

誰かがこの分野が何であるかをはっきりと私に説明できますか?そして、誰かがそれを何のために使うことができますか?

4

2 に答える 2

2

udataフィールドは変更されずにカーネルに渡され、カーネルから渡され、いかなる方法でも使用されません。このフィールドの使用法は完全にアプリケーションに依存し、関数ディスパッチルーチンを効率的に実装する方法、またはkevent構造にアプリケーション識別子を追加する方法として提供されます。

完全なリファレンスについては、次のペーパーを確認してください。

Kqueue:汎用的でスケーラブルなイベント通知機能

于 2013-03-25T05:25:28.933 に答える
1

swpdは正しいです。「ユーザーデータ」の概念は、イベント処理APIや、呼び出し元がコールバック関数を提供するAPIで広く使用されていることを付け加えておきます。ユーザーデータ(通常はvoidポインター)は逐語的に返されます。

ユーザーデータのもう1つの例は、(Web)Cookieです。WebサーバーがSet-Cookieヘッダーを設定すると、後続の各要求でコンテンツを(Cookieヘッダーで)送り返すようにブラウザーに要求します。カーネルがudata-fieldの解釈を行わないのと同じように、ブラウザはCookieを解釈することを期待されていません。Cookieを送り返すだけです。

于 2013-04-10T22:23:56.373 に答える