linux sockets epoll

linux - ¿Es necesario anular el registro de un socket de epoll antes de cerrarlo?



sockets (1)

De la página del manual :

P6 ¿Cerrar un descriptor de archivo hará que se elimine de todos los conjuntos de epolls automáticamente?

A6 Sí, pero ten en cuenta el siguiente punto. Un descriptor de archivo es una referencia a una descripción de archivo abierto (consulte open (2)). Cada vez que se duplica un descriptor mediante dup (2), dup2 (2), fcntl (2) F_DUPFD o fork (2), se crea un nuevo descriptor de archivo que hace referencia a la misma descripción de archivo abierto. Una descripción de archivo abierto continúa existiendo hasta que todos los descriptores de archivo que se refieren a ella se hayan cerrado. Un descriptor de archivo se elimina de un conjunto de epoll solo después de que todos los descriptores de archivo que se refieren a la descripción del archivo abierto subyacente se hayan cerrado (o antes si el descriptor se elimina explícitamente utilizando epoll_ctl (2) EPOLL_CTL_DEL ). Esto significa que incluso después de que se haya cerrado un descriptor de archivo que forma parte de un conjunto de epoll , los eventos pueden informarse para ese descriptor de archivo si otros descriptores de archivo que se refieren a la misma descripción de archivo subyacente permanecen abiertos.

Suponga el siguiente código donde "calcetín" es un identificador para el socket TCP que se registró previamente con un descriptor de archivos epoll designado por dfpe.

epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev); close(sock);

¿Sigue siendo necesario llamar a epoll_ctl si el socket se cerrará posteriormente de todos modos? ¿O el socket se anula de forma implícita como resultado de cerrarlo?