在 stdin 上立即执行 epoll returns
epoll instantly returns on stdin
我尝试使用标准输入和其他一些 fd 进行非阻塞 IO。
我将它们添加到 rust 库 mio
,但在使用 strace 进行调试时我发现这是一个 epoll 问题。
当我将 stdin 添加到 epoll 时,epoll_wait returns 立即。我是否连接了 shell/term 或通过管道输入其他内容(例如 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)));
}
}
Specifying a timeout equal to zero cause epoll_wait()
to return immediately.
epoll_wait()
上的超时值 0
表示:return 立即并且仅报告当前未决事件。
您需要指定超时值 -1
,这意味着,"wait indefinitely for events":
epoll_wait(fd, &event, 1, -1);
然后它应该按预期工作。
我尝试使用标准输入和其他一些 fd 进行非阻塞 IO。
我将它们添加到 rust 库 mio
,但在使用 strace 进行调试时我发现这是一个 epoll 问题。
当我将 stdin 添加到 epoll 时,epoll_wait returns 立即。我是否连接了 shell/term 或通过管道输入其他内容(例如 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)));
}
}
Specifying a timeout equal to zero cause
epoll_wait()
to return immediately.
epoll_wait()
上的超时值 0
表示:return 立即并且仅报告当前未决事件。
您需要指定超时值 -1
,这意味着,"wait indefinitely for events":
epoll_wait(fd, &event, 1, -1);
然后它应该按预期工作。