是否有可能在换行返回之前中断/取消
io::stdin().read_line()
或中断标准输入读取?
我有一个线程轮询信号,当收到信号时
SIGINT
应该停止io::stdin().read_line()
.
use std::io::Write;
use std::{io, thread};
use std::error::Error;
use std::sync::{Arc, atomic::AtomicUsize, atomic::Ordering};
use signal_hook::consts::signal;
use signal_hook::flag;
const SIGINT_U: usize = signal::SIGINT as usize;
fn main() -> Result<(), Box<dyn Error>> {
let term = Arc::new(AtomicUsize::new(0));
signal_hook::flag::register_usize(signal::SIGINT, Arc::clone(&term), SIGINT_U).unwrap();
thread::spawn(move || loop {
match term.load(Ordering::Relaxed) {
0 => {
// do nothing
},
SIGINT_U => {
// interrupt running read_line()
},
_ => unreachable!()
}
});
loop {
print!("> ");
io::stdout().flush().unwrap();
let mut line = String::new();
io::stdin()
.read_line(&mut line)
.expect("Failed to read stdin");
let command = line.trim_end().trim_start().to_lowercase();
if command == "exit" {
break;
}
println!("received: {}", line);
}
}
如果我们将
io::stdin().read_line()
放入单独的线程中,而 SIGINT
检查在主循环中,效果应该是一样的。
问题是,当到达
read_line()
时,stdin 不会停止读取,直到到达换行符。这是标准和预期的行为,但我希望我能以某种方式停止它的执行。尽管通过停止杀死运行它的线程,或者以某种方式取消它的返回并在不读取标准输入的情况下停止。
我确实尝试将
read_line()
放在单独的线程上并检测何时收到 SIGINT
。但这没关系,因为线程循环不能在 read_line()
执行时停止,只能在它之前或之后停止。
我想也许我可以杀死正在运行的线程
read_line()
,但显然不可能杀死线程。