Подтвердить что ты не робот

Нужно ли отменить регистрацию сокета от epoll до его закрытия?

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

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

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

4b9b3361

Ответ 1

На странице man:

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

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