epoll мгновенно возвращается на стандартный ввод
Я пытался сделать неблокирующий ввод-вывод с помощью стандартного ввода и некоторых других fd. Я добавил их в библиотеку ржавчины mio
, но во время отладки с помощью strace я обнаружил, что это проблема epoll.
Когда я добавляю stdin в epoll, epoll_wait мгновенно возвращается. Не имеет значения, если у меня есть оболочка / термин подключен или труба что-то еще (например, cat
).
Минимальный код C, чтобы наблюдать это:
#include <sys/epoll.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
char buffer[4096];
int fd = epoll_create(5);
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = 0;
epoll_ctl(fd, EPOLL_CTL_ADD, 0, &event);
for (;;) {
fprintf(stderr, "Going into epoll_wait\n");
epoll_wait(fd, &event, 1, 0);
fprintf(stderr, "Going into read: %d\n", event.data.fd);
printf("%ld\n", read(0, buffer, sizeof(buffer)));
}
}
2 ответа
Решение
Значение тайм-аута 0
на epoll_wait()
означает: возвращаться немедленно и сообщать только о текущих ожидающих событиях.
Вам необходимо указать значение тайм-аута -1
, что означает "ждать событий бесконечно":
epoll_wait(fd, &event, 1, -1);
Тогда все должно работать как положено.
man epoll_wait
:
Задание времени ожидания равным нулю
epoll_wait()
немедленно вернуться.