В чем преимущество использования epoll с create1() вместо того, чтобы создать запрос()


Я переписываю многопоточное приложение Linux-2.6.32+ для замены select с помощью epoll.

Man-страницы для epoll_create1(2) объявляют, что:

Если флаги равны 0, то, кроме того, что устаревший аргумент размера отброшен, epoll_create1() является тем же самым, что и epoll_create().

Но разве этот устаревший аргумент размера не используется в epoll_wait(2) как maxevents?

epoll_wait(int epfd, struct epoll_event *events,
                  int maxevents, int timeout);

Это означает, когда используя epoll, мы можем избежать объявления максимального числа событий в epoll_create1 , но рано или поздно нам придется ссылаться на него при вызове epoll_wait? Если да, то какой смысл вводить epoll_create1 в игру?

Спасибо, что просветили меня на этот счет.
2 6

2 ответа:

Нет, с epoll_wait, maxevents сообщает вам максимальное количество событий, которые будут возвращены . это не имеет никакого отношения к тому, сколько из них поддерживается в ядре.

Более старые версии epoll_create использовали размер для установки определенных ограничений, но он больше не используется, поэтому комментарий, что аргумент size устарел.

Преимущество использования epoll_create1 заключается в том, что оно позволяет указать флаги, которые, как я думаю, в настоящее время ограничены close-on-exec (так что файловый дескриптор автоматически закрывается, когда execИнг другой процесс).

epoll_create1() предоставляют способ установки флага. Излишне устанавливать размер сейчас.

Фактически в исходном коде ядра: /fs / eventpoll.c

SYSCALL_DEFINE1(epoll_create, int, size)
{
    if (size <= 0)
        return -EINVAL;

    return sys_epoll_create1(0);
}

Параметр epoll_wait() max_events предназначен для управления обратным счетом fd, а не общим счетом fd во всей структуре eventpoll