У меня есть два файловых дескриптора, один файловый дескриптор чтения на конвейере и другой дескриптор подключения к сокету. Ни один из них не является неблокирующим. Оба они добавляются в контекст epoll одним событием EPOLLIN. Наконец, я вызываю epoll_wait с таймаутом = -1. Ниже приведен пример кода. У меня два вопроса: -
Дескрипторы каналов и соединений должны быть неблокирующими. Это не срабатывает по фронту. Если да, то это хорошая практика или обязательно, а если обязательно, то почему?
Я устанавливаю тайм-аут на -1, но epoll_wait немедленно возвращает значение 0. Почему это происходит? с тайм-аутом -1, epoll_wait должен возвращать значение только при наличии события.
int total_fd_ready = -1; struct epoll_event pipe_event, connection_event, total_events[64]; pipe_event.data.fd = pipe_fd[0]; piple_event.events = EPOLLIN; connection_event.data.fd = conn_fd; connection_event.events = EPOLLIN; total_fd_ready = Epoll_wait(epoll_fd, total_events, 64, -1); printf("%d\n", total_fd_ready);
Epoll_wait определяется как
int Epoll_wait(int e_fd, struct epoll_event *events, int max_events, int timeout) { #ifdef DBG printf("Epoll_wait called on epoll_fd: %d with max_events: %d and timeout: %d\n", e_fd, max_events, timeout); #endif int result = -1; if(result = (epoll_wait(e_fd, events, max_events, timeout)) < 0) if(errno != EINTR) err_sys("epoll_wait error with epoll fd: %d and timeout : %d\n", e_fd, timeout); #ifdef DBG else printf("epoll_wait was interrupted\n"); #endif return result; }
ОБНОВЛЕНИЕ: обнаружил проблему, хотя я не могу объяснить, почему для результата установлено значение 0. Мне нужны наручники в следующем операторе if
if((result = (epoll_wait(e_fd, events, max_events, timeout))) < 0)
1 ответ
Ответ заключается в том, что оператор сравнения <
имеет более высокий приоритет, чем присваивание, что означает, что result
присваивается результат выражения (epoll_wait(e_fd, events, max_events, timeout)) < 0
.
read(2)
блокироваться, полностью нарушая природу мультиплексирования epoll(7)
.
EAGAIN
, а это невозможно с дескриптором блокировки.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
total_events
?gcc -Wall
компилятор предупредил бы вас соответствующим образом