#c #kqueue
#c #kqueue
Вопрос:
Я использую C и пытаюсь понять, как kqueue обрабатывает определенные случаи с сокетами. Я надеюсь, что кто-нибудь может помочь мне подтвердить, что происходит при удалении любого события.
Согласно этому веб-сайту https://www.daemon-systems.org/man/kqueue .2.html
в нем говорится:
«Вызов close(2) для файлового дескриптора приведет к удалению всех элементов, которые ссылаются на дескриптор».
Взглянув на этот исходный код на Github: https://github.com/illahaha/simple-tcp-server/blob/master/main.c то есть используется kqueue с сокетами.
в этой части кода:
if (revents[i].data == 0 amp;amp; revents[i].flags amp; EV_EOF) {
fprintf(stderr, "[INFO] Lost connection with %s:%un",
peer->ascii_addr, peer->port);
if (close(peer->fd) == -1)
fatal("close()");
ATOMIC_STORE(peer->is_connected, false);
continue;
}
Автор не будет повторно использовать этот индекс события позже. Он только закрыт, и kqueue удалит его.
Итак, мой вопрос:
Когда kqueue удаляет какое-либо событие, он также изменяет все индексы событий?
Если нет, будет ли хорошей практикой повторно использовать этот удаленный индекс при регистрации kevent в kqueue позже?
Если да, будет ли хорошей практикой повторно использовать последний регистр kevent index с kqueue позже?
Комментарии:
1. События не имеют индексов. Индекс события в списке событий или списке изменений — это просто индекс массива, не более того. Насколько я знаю, нет API, который позволял бы ссылаться на событие по «индексу», поэтому я действительно не знаю, о чем вы говорите в своем последнем абзаце.