Зачем epoll_ctl дважды нужен файловый дескриптор? - PullRequest
2 голосов
/ 10 июля 2019

В примере:

event.events = EPOLLIN;
event.data.fd = fd;

int ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, event.data.fd, &event);

Я передаю дескриптор файла как элемент event.data и как отдельный аргумент.

Что означает epoll_ctlнужен дескриптор файла дважды?

Ответы [ 2 ]

1 голос
/ 24 июля 2019

Это дубликат о epoll_ctl ()

Причина, по которой он нужен дважды, заключается в том, что data внутри event является union.epoll_ctl не знает, действительно ли вы указали дескриптор файла или что-то еще.

typedef union epoll_data {
    void        *ptr;
    int          fd;
    uint32_t     u32;
    uint64_t     u64;
} epoll_data_t;
1 голос
/ 23 июля 2019

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)

Где:

epfd - дескриптор файла, возвращаемый epoll_create, который идентифицирует экземпляр epoll в ядре.

fd - дескриптор файла, который мы хотим добавить в список epoll / список интересов.

op относится к операции, выполняемой над дескриптором файла fd. В целом поддерживаются три операции:

  • Зарегистрируйте fd в экземпляре epoll (EPOLL_CTL_ADD) и получите уведомление о событиях, происходящих на fd
  • Удалить / отменить регистрацию fd из экземпляра epoll. Это будет означать, что процесс больше не будет получать никаких уведомлений о событиях в этом файловом дескрипторе (EPOLL_CTL_DEL). Если файловый дескриптор был добавлен в несколько экземпляров epoll, закрытие его удалит его из всех списков интересов epoll, в которые он был добавлен.
  • Изменить события, которые отслеживает (EPOLL_CTL_MOD)

event - указатель на структуру epoll_event, в которой хранится событие, за которым мы на самом деле хотим следить за fd.

Первые события поля структуры epoll_event являются битовой маской, которая указывает, за какими событиями отслеживается fd.

Точно так же, если fd является сокетом, мы могли бы отслеживать его на предмет поступления новых данных в буфер сокета (EPOLLIN). Мы могли бы также захотеть отслеживать fd для уведомлений, инициируемых с помощью ребра, что делается путем ИЛИ EPOLLET с EPOLLIN. Мы также можем захотеть отслеживать fd на наличие зарегистрированного события, но только один раз и прекратить мониторинг fd на последующие появления этого события. Это может быть достигнуто с помощью ИЛИ-а других флагов (EPOLLET, EPOLLIN), которые мы хотим установить для дескриптора fd с флагом для однократной доставки уведомления EPOLLONESHOT. Все возможные флаги можно найти на странице руководства.

Вторым полем структуры epoll_event является поле объединения.

Источник

Добавлены некоторые дополнительные данные помимо того, что запрашивалось для контекста.

Надеюсь, это поможет!

...