It's a fundamental Linux API for writing event loops of any kind. In addition to watching sockets, you also have eventfd (alternative to semaphores and condition variables), timerfd (timers managed by the kernel), signalfd (handle signals safely and synchronously), pidfd (handle child process events).
They allow you to handle heterogenous events inside that same loop, reducing the usage of threads.
For async disk IO, io_uring is the way to go.