C epoll立即返回stdin
我试着用stdin和其他一些fd做非阻塞IO。 我将它们添加到rust库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) {
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);