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 является поле объединения.
Источник
Добавлены некоторые дополнительные данные помимо того, что запрашивалось для контекста.
Надеюсь, это поможет!