Why I/O Multiplexing and Event Loops Are Common
Many Linux services eventually become event loops: network sockets, pipes, timerfd, eventfd, device nodes, and signal notifications all enter a select, poll, or epoll loop.
This is not because epoll is a more advanced read(). It solves a more basic problem: one thread cannot block on many read() calls at the same time.
If a program has only one socket, blocking read() is natural. Once it must handle hundreds of connections, one control pipe, several timers, and a device fd, it cannot let the thread get stuck on any single object.