linux 下可以通过注册SIGINT
的事件处理函数来捕获 ctrl + c
信号,而windows下控制台进程只能通过调用SetConsoleCtrlHandler
函数设置 ctrl + c
信号处理函数。
安装依赖
cargo add ctrlc
此依赖支持 linux 和 windows 系统。
使用示例
- 用户
ctrl + c
操作会执行set_handler
定义的事件处理函数。 - 事件处理函数将
STOP_FLAG
静态变量标记为true
。 - 主进程和子线程可以通过判断静态变量
STOP_FLAG
的值来主动释放资源。
use ctrlc;
use std::sync::mpsc::channel;
use std::sync::{atomic::AtomicBool, OnceLock};
// 进程停止标识
static STOP_FLAG: OnceLock<AtomicBool> = OnceLock::new();
#[test]
fn test_ctrlc() {
let (tx, rx) = channel();
ctrlc::set_handler(move || {
tx.send(()).expect("Could not send signal on channel.");
match STOP_FLAG.set(AtomicBool::new(true)) {
Ok(_) => {
// 设置停止标记
// ...
}
Err(_) => return,
}
})
.expect("Error setting Ctrl-C handler");
println!("Waiting for Ctrl-C...");
// rx.recv().expect("Could not receive from channel.");
if STOP_FLAG.get().is_some() {
// 收到进程停止标记
// ...
}
println!("Got it! Exiting...");
}