Почему epoll использует комбинацию номера файлового дескриптора и описания открытого файла для различения зарегистрированных файловых дескрипторов?

#c #linux #kernel #epoll

Вопрос:

В эполле(7):

  1. Какой ключ используется для различения файловых дескрипторов, зарегистрированных в списке интересов?
    Ключом является комбинация номера дескриптора файла и описания открытого файла (также известного как «дескриптор открытого файла», внутреннее представление открытого файла в ядре).

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 на этой справочной странице.