Что такое поле udata в struct kevent?

Я эмулирую определенную функциональность 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 */
     };

Я пробовал поиск, но самая длинная форма литературы, которую я мог найти об этом поле, это "Непрозрачное пользовательское значение, переданное через ядро ​​без изменений". Что не очень помогает.

Может ли кто-нибудь объяснить мне, что это за поле? И для чего кто-то может использовать это?

2 ответа

Решение

Поле udata передается в ядро ​​и из него без изменений и никоим образом не используется. Использование этого поля полностью зависит от приложения и предоставляется в качестве способа эффективной реализации процедуры диспетчеризации функций или иного добавления идентификатора приложения в структуру kevent.

для полной справки, пожалуйста, проверьте следующую бумагу:

Kqueue: универсальное и масштабируемое средство уведомления о событиях

swpd правильный. Я просто хотел бы добавить, что понятие "пользовательские данные" широко используется в API обработки событий и тех, где функция обратного вызова предоставляется вызывающей стороной. Пользовательские данные (обычно указатель void) передаются обратно дословно.

Другим примером пользовательских данных являются (веб) куки - когда веб-сервер устанавливает заголовок Set-Cookie, он просит браузер отправлять содержимое обратно (в заголовке Cookie) с каждым последующим запросом. От браузера не ожидается, что он каким-либо образом интерпретирует файлы cookie - так же как ядро ​​не интерпретирует поле udata - просто отправьте его обратно.

Другие вопросы по тегам