Изменяет ли kqueue индексы после удаления какого-либо события?

#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, который позволял бы ссылаться на событие по «индексу», поэтому я действительно не знаю, о чем вы говорите в своем последнем абзаце.