Assume the following code where "sock" is a handle to TCP socket that was previously registered with an epoll file descriptor designated by epfd.
epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev);
close(sock);
Is it still necessary to call epoll_ctl if the socket is going to get subsequently closed anyway? Or does the socket get implicitly deregistered as a result of closing it?
From the man page:
Q6 Will closing a file descriptor cause it to be removed from all epoll sets
automatically?
A6 Yes, but be aware of the following point. A file descriptor is a
reference to an open file description (see open
(2)). Whenever a
descriptor is duplicated via dup
(2), dup2
(2), fcntl
(2) F_DUPFD
, or
fork
(2), a new file descriptor referring to the same open file description
is created. An open file description continues to exist until all file
descriptors referring to it have been closed. A file descriptor is
removed from an epoll
set only after all the file descriptors referring to
the underlying open file description have been closed (or before if the
descriptor is explicitly removed using epoll_ctl
(2) EPOLL_CTL_DEL
). This
means that even after a file descriptor that is part of an epoll
set has
been closed, events may be reported for that file descriptor if other file
descriptors referring to the same underlying file description remain open.