В чем преимущество использования 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 ответа:
Нет, с
Более старые версии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