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() немедленно вернуться.

Другие вопросы по тегам