rust - windows下实现捕获ctrlc信号

linux 下可以通过注册SIGINT的事件处理函数来捕获 ctrl + c 信号,而windows下控制台进程只能通过调用SetConsoleCtrlHandler函数设置 ctrl + c 信号处理函数。

安装依赖

cargo add ctrlc

此依赖支持 linux 和 windows 系统。

使用示例

  1. 用户 ctrl + c 操作会执行set_handler定义的事件处理函数。
  2. 事件处理函数将 STOP_FLAG 静态变量标记为 true
  3. 主进程和子线程可以通过判断静态变量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...");
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值