Вы перечислили события, которые могут разбудить Эполла, поэтому на самом деле возникает вопрос: «Как мне уменьшить шаблон для трюка с самотрубкой?»
Ответ на этот вопрос действительно зависит от вашего кода, языка и того, что вы пытаетесь сделать. Я предполагаю, что у вас есть поток, который обрабатывает ввод / вывод, и вы хотите выполнять другую работу в этом потоке, пока ввод / вывод не готов. В коде, который управляет циклом epoll, он может иметь внутренний дескриптор, который предоставляется другим частям системы в качестве функции «пробуждения» или «отправки работы».
Есть библиотеки, которые делают это, например boost.asio для C ++. Тем не менее, написать свой собственный нетрудно, если вы просто нацеливаетесь на epoll, и количество действительного стандартного кода должно быть минимальным, если у вас есть класс / модуль / что-нибудь, что имеет дело с циклом epoll.