Нужно ли отменять регистрацию сокета в epoll перед его закрытием? - PullRequest
19 голосов
/ 03 января 2012

Предположим, что следующий код, где «sock» - это дескриптор сокета TCP, который ранее был зарегистрирован с помощью дескриптора файла epoll, обозначенного epfd.

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

По-прежнему ли необходимо вызывать epoll_ctl, если сокет впоследствии все равно будет закрыт? Или сокет неявно отменяется из-за его закрытия?

1 Ответ

30 голосов
/ 03 января 2012

Со страницы руководства :

Q6 Будет ли закрытие файлового дескриптора причиной его автоматического удаления из всех наборов epoll?

A6 Да, но учтите следующее.Описатель файла - это ссылка на описание открытого файла (см. open (2)).Всякий раз, когда дескриптор дублируется с помощью dup (2), dup2 (2), fcntl (2) F_DUPFD или fork (2), новый дескриптор файла, ссылающийся на то же самое описание открытого файла,создано.Описание открытого файла продолжает существовать до тех пор, пока все дескрипторы файлов, ссылающиеся на него, не будут закрыты.Файловый дескриптор удаляется из набора epoll только после того, как все файловые дескрипторы, относящиеся к базовому открытому описанию файла, были закрыты (или до того, как дескриптор был явно удален с использованием epoll_ctl (2) EPOLL_CTL_DEL).Это означает, что даже после того, как дескриптор файла, который является частью набора epoll, был закрыт, о событиях для этого дескриптора файла можно сообщать, если другие дескрипторы файла, ссылающиеся на то же самое описание файла, остаются открытыми.

...