如何在mio事件循环中从未缓冲文件读取Unicode代码点?
我想使用mio板条箱来阅读键盘,因为它们以无缓冲方式到达。我已经有了解除缓冲stdin的代码,并且我已经构建了事件循环:如何在mio事件循环中从未缓冲文件读取Unicode代码点?,unicode,rust,event-loop,mio,Unicode,Rust,Event Loop,Mio,我想使用mio板条箱来阅读键盘,因为它们以无缓冲方式到达。我已经有了解除缓冲stdin的代码,并且我已经构建了事件循环: extern crate mio; extern crate termios; use termios::{Termios, TCSANOW, ICANON, ECHO, tcsetattr}; use mio::*; use mio::unix::EventedFd; fn unbuffer_stdin() { let termios = Termios::fr
extern crate mio;
extern crate termios;
use termios::{Termios, TCSANOW, ICANON, ECHO, tcsetattr};
use mio::*;
use mio::unix::EventedFd;
fn unbuffer_stdin() {
let termios = Termios::from_fd(0).unwrap();
let mut new_termios = termios.clone();
new_termios.c_lflag &= !(ICANON | ECHO);
tcsetattr(0, TCSANOW, &mut new_termios).unwrap();
}
fn main() {
let stdin = 0;
unbuffer_stdin();
let poll = Poll::new().unwrap();
const STDIN: Token = Token(0);
let ev_fd = EventedFd(&stdin);
poll.register(&ev_fd, STDIN, Ready::readable(), PollOpt::edge()).unwrap();
let mut events = Events::with_capacity(1024);
loop {
poll.poll(&mut events, None).unwrap();
for event in events.iter() {
match event.token() {
STDIN => {
println!("keypress");
// XXX read in ready codepoints to a buffer
}
_ => unreachable!(),
}
}
}
}
如何实现标记为XXX的部件?有几个挑战:
- 我如何知道要读取多少字节?我不确定米奥是否告诉我了
- 如何处理部分代码点,其中读取跨越多字节字符
oneshot
事件而不是edge
事件,然后将每个事件的一个字节读入临时缓冲区。每次缓冲区作为一个完整的代码点有意义时,我就可以将它转换成一个char
并将其存储起来,然后清除暂存缓冲区
但这似乎有点低效。最好的方法是什么