Что такое поле 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 - просто отправьте его обратно.