epoll立即返回stdin

时间:2017-06-30 14:31:47

标签: c linux epoll

我尝试使用stdin和其他一些fd进行非阻塞IO。 我将它们添加到防锈库mio中,但在使用strace调试时我发现这是一个epoll问题。

当我将stdin添加到epoll时,epoll_wait立即返回。如果我将shell /术语连接起来或管道其他内容(例如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 :(得分:3)

0上的超时值epoll_wait()表示:立即返回,仅报告当前待处理的事件。

您需要指定超时值-1,这意味着“无限期地等待事件”:

epoll_wait(fd, &event, 1, -1);

然后它应该按预期工作。

答案 1 :(得分:1)

man epoll_wait

  

指定超时等于零会导致epoll_wait()立即返回。