我试着用stdin和其他fd做非阻塞IO。我将它们添加到锈蚀库mio中,但是在使用strace进行调试时,我发现这是epoll问题。
当我向epoll添加stdin时,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)));
}
}发布于 2017-06-30 14:37:18
epoll_wait()上的超时值epoll_wait()意味着:立即返回,并且只报告当前挂起的事件。
您需要指定超时值-1,这意味着“无限期等待事件”:
epoll_wait(fd, &event, 1, -1);那么它应该会像预期的那样起作用。
发布于 2017-06-30 14:36:41
man epoll_wait
指定等于零的超时会导致
epoll_wait()立即返回。
https://stackoverflow.com/questions/44848896
复制相似问题