我尝试使用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)));
}
}
答案 0 :(得分:3)
0
上的超时值epoll_wait()
表示:立即返回,仅报告当前待处理的事件。
您需要指定超时值-1
,这意味着“无限期地等待事件”:
epoll_wait(fd, &event, 1, -1);
然后它应该按预期工作。
答案 1 :(得分:1)
指定超时等于零会导致
epoll_wait()
立即返回。