#c #linux #kernel #epoll
Вопрос:
В эполле(7):
- Какой ключ используется для различения файловых дескрипторов, зарегистрированных в списке интересов?
Ключом является комбинация номера дескриптора файла и описания открытого файла (также известного как «дескриптор открытого файла», внутреннее представление открытого файла в ядре).
Epoll используется struct epoll_filefd
для различения элементов в списке интересов и в fs/eventpoll.c
:
/* Compare RB tree keys */
static inline int ep_cmp_ffd(struct epoll_filefd *p1,
struct epoll_filefd *p2)
{
return (p1->file > p2->file ? 1:
(p1->file < p2->file ? -1 : p1->fd - p2->fd));
}
Похоже, что Epoll struct file
сначала сравнивает указатель, а затем номер fd. Почему бы просто не использовать номер fd, поскольку приложения могут совершать вызовы epoll только по номеру fd?
Комментарии:
1. Потому что с точки зрения системы,
->file
это первичный ключ , ссылающийся на таблицу системных файлов. Это->fd
поле имеет смысл только в пространстве пользователя. При обновлении дерева (или для отправки уведомлений) система знает только->file
участника.2. Потому что несколько файловых дескрипторов могут указывать на одно и то же описание файла. Продолжайте и прочитайте Q1 и A1 после Q0 и A0 на этой справочной странице.