首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >epoll立即返回stdin

epoll立即返回stdin
EN

Stack Overflow用户
提问于 2017-06-30 14:31:46
回答 2查看 1.9K关注 0票数 1

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

当我向epoll添加stdin时,epoll_wait立即返回。不管我是否将shell/术语连接在一起,或者将其他东西连接在一起(例如,cat)。

观察这一点的最小C代码:

代码语言:javascript
复制
#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)));
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-30 14:37:18

epoll_wait()上的超时值epoll_wait()意味着:立即返回,并且只报告当前挂起的事件。

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

代码语言:javascript
复制
epoll_wait(fd, &event, 1, -1);

那么它应该会像预期的那样起作用。

票数 3
EN

Stack Overflow用户

发布于 2017-06-30 14:36:41

man epoll_wait

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44848896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档