I am still astounded that an API which fundamentally violates standard file descriptor semantics made it into the kernel. (If you, e.g., pass an epoll-registered file descriptor to another process via SCM_RIGHTS, you can never unregister the corresponding open file object from the receiving process, because the epoll unregister syscall requires the originally registered fd value, which is invalid in a different process.) That points to something very wrong in the Linux development process.