【发布时间】:2020-09-14 17:13:40
【问题描述】:
以下代码在运行时不响应终端输入。我在 Debian 10.5.0 和 CentOS 7 下运行了它,结果相同。我错过了什么?
#include <sys/epoll.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
char buffer[4096];
int fd = epoll_create1(EPOLL_CLOEXEC);
struct epoll_event event;
int ctl_ret;
event.events = EPOLLIN;
event.data.fd = STDIN_FILENO;
ctl_ret = epoll_ctl(fd, EPOLL_CTL_ADD, STDIN_FILENO, &event);
if (ctl_ret) {
perror("epoll_ctl");
return 1;
}
int nr_event;
for (;;) {
fprintf(stderr, "Starting epoll_wait\n");
nr_event = epoll_wait(fd, &event, 1, -1);
if (nr_event < 0) {
perror("epoll_wait");
return 1;
}
fprintf(stderr, "Reading: %d\n", event.data.fd);
printf("%ld\n", read(0, buffer, sizeof(buffer)));
}
}
【问题讨论】:
-
epoll_create1 或 epoll_ctl 是否有任何错误?
-
没有。我已经更新了上面的代码来检查 epoll_ctl() 和 epoll_wait() 错误。
-
你的实现很好。执行
for (;;) { long nbytes = 0; ... nbytes = read(0, buffer, sizeof(buffer)); buffer[nbytes-1] = 0; printf("%ld - %s\n", nbytes, buffer); if (strcmp (buffer, "quit") == 0) break;,您会看到epoll_wait很高兴地等待fd上的数据可用,然后read将返回号码。读取的字节数(我们用0覆盖buffer中的'\n'以将内容视为字符串),然后检查条目是否为"quit"以退出。我没有发现任何问题。 -
你试过不用epoll来看看你的程序是否真的在标准输入上得到任何数据吗?