C epoll立即返回stdin

C epoll立即返回stdin,c,linux,epoll,C,Linux,Epoll,我试着用stdin和其他一些fd做非阻塞IO。 我将它们添加到rust库mio,但在使用strace进行调试期间,我发现这是一个epoll问题 当我将stdin添加到epoll时,epoll_wait会立即返回。无论我是否连接了外壳/术语,还是将其他内容导入管道(例如,cat) 遵守这一点的最小C代码: #include <sys/epoll.h> #include <stdio.h> #include <unistd.h> int main(void) {

我试着用stdin和其他一些fd做非阻塞IO。 我将它们添加到rust库
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)));
    }
}
#包括
#包括
#包括
内部主(空)
{
字符缓冲区[4096];
int fd=epoll_create(5);
结构epoll_事件;
event.events=EPOLLIN;
event.data.fd=0;
epoll\u ctl(fd、epoll\u ctl\u ADD、0和事件);
对于(;;){
fprintf(stderr,“进入epoll_wait\n”);
epoll_wait(fd和event,1,0);
fprintf(stderr,“进入读取:%d\n”,event.data.fd);
printf(“%ld\n”,读取(0,缓冲区,sizeof(缓冲区));
}
}

指定等于零的超时将导致
epoll\u wait()
立即返回

:

指定等于零的超时将导致
epoll\u wait()
立即返回


epoll\u wait()
上的超时值
0
表示:立即返回,仅报告当前挂起的事件

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


然后它应该能按预期工作。

epoll\u wait()
上的超时值
0
表示:立即返回,只报告当前挂起的事件

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


然后,它应该按预期工作。

检查您的返回值!这些事情中的任何一个都可能失败,你永远不会知道。将
超时设置为
-1
,而不是
0
。来吧,这是第一件要做的事——阅读手册!检查您的返回值!这些事情中的任何一个都可能失败,你永远不会知道。将
超时设置为
-1
,而不是
0
。来吧,这是第一件要做的事——阅读手册!是的,我很愚蠢。所以我把我的最小测试搞砸了。@Ongy也许你把它和
select()
混在一起了,其中超时参数
0
(在那里是一个空指针)意味着“无限期地等待”。我想轮询也是如此。对虽然我想要使用的实际的rust库(它将我引入到这个库中)确实正确地执行-1,但这是我在示例代码中犯的一个错误。我想把它作为一个单独的问题发布(没有引用我删掉的代码),但我必须等90分钟-对,我太蠢了。所以我把我的最小测试搞砸了。@Ongy也许你把它和
select()
混在一起了,其中超时参数
0
(在那里是一个空指针)意味着“无限期地等待”。我想轮询也是如此。对虽然我想要使用的实际的rust库(它将我引入到这个库中)确实正确地执行-1,但这是我在示例代码中犯的一个错误。我想把它作为一个单独的问题发布(没有引用我编写的代码),但我不得不等待90分钟-
epoll_wait(fd, &event, 1, -1);