中断和取消 io::stdin().read_line()

问题描述 投票:0回答:0

是否有可能在换行返回之前中断/取消

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()
,但显然不可能杀死线程。

multithreading rust stdin
© www.soinside.com 2019 - 2024. All rights reserved.