尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
rust-ctrlc 快速入门:5 分钟让 Rust CLI 程序优雅响应 Ctrl-C
rust-ctrlc 快速入门5 分钟让 Rust CLI 程序优雅响应 Ctrl-C【免费下载链接】rust-ctrlcEasy Ctrl-C handler for Rust projects项目地址: https://gitcode.com/gh_mirrors/ru/rust-ctrlc当用户按下Ctrl-C时你的 Rust 命令行程序会立刻被系统强制终止正在写入的数据可能损坏、临时文件可能残留——这几乎是每个 Rust CLI 开发者都会遇到的痛点。rust-ctrlc就是为解决这个问题而生的轻量级库它提供一个简单易用的Rust Ctrl-C 信号处理接口只需一个回调函数就能让程序在收到中断信号时优雅地完成收尾工作。无论你是 Rust 新手还是老手掌握这个Rust 信号处理技巧都只需要 5 分钟。为什么需要优雅处理 Ctrl-C 信号先看一个典型场景你的程序正在写日志、保存进度或上传文件用户突然按下CtrlC进程直接退出数据可能丢失一半。更糟的是程序可能来不及清理临时文件或释放资源。rust-ctrlc正是为此而生它在后台开启一个专用的信号处理线程收到信号后执行你预先写好的清理逻辑让程序「善始善终」。默认行为使用 rust-ctrlc 后进程被直接杀死无任何回调触发你的回调函数可保存状态、清理资源无法控制退出流程可选择在回调中直接退出或先收尾再退出仅支持 Ctrl-C开启 feature 后还可处理 SIGTERM、SIGHUP快速开始只需两步添加依赖第一步在Cargo.toml中加入依赖[dependencies] ctrlc 3.5第二步在你的src/lib.rs或main.rs中调用ctrlc::set_handler注册回调即可。库的入口实现就在项目的 src/lib.rs 中核心 API 一目了然。最简单的用法一个标志位搞定如果你只是想「收到 Ctrl-C 后让主循环停下来」用AtomicBool就够了use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; fn main() { let running Arc::new(AtomicBool::new(true)); let r running.clone(); ctrlc::set_handler(move || { r.store(false, Ordering::SeqCst); }).expect(Error setting Ctrl-C handler); println!(Waiting for Ctrl-C...); while running.load(Ordering::SeqCst) {} println!(Got it! Exiting...); }主循环每秒检查一次标志位收到信号后自然退出全程无阻塞、无 panic。进阶用法用通道传递消息如果你需要在回调里把事件「发出去」配合std::sync::mpsc通道是最经典的模式这也是项目自带示例 examples/readme_example.rs 的写法use std::sync::mpsc::channel; fn main() { let (tx, rx) channel(); ctrlc::set_handler(move || tx.send(()).expect(Could not send signal on channel.)) .expect(Error setting Ctrl-C handler); println!(Waiting for Ctrl-C...); rx.recv().expect(Could not receive from channel.); println!(Got it! Exiting...); }主线程在rx.recv()上等待收到 Ctrl-C 后回调向通道发送消息主线程随即继续执行收尾逻辑。想本地跑一遍直接执行cargo build --examples target/debug/examples/readme_example。如何一次性优雅退出连续按两次 Ctrl-C用户经常手滑连按两次 Ctrl-C。更聪明的做法是第一次触发收尾逻辑第二次强制退出。项目示例 examples/issue_46_example.rs 展示了这个「双保险」模式let running Arc::new(AtomicUsize::new(0)); let r running.clone(); ctrlc::set_handler(move || { let prev r.fetch_add(1, Ordering::SeqCst); if prev 0 { println!(Exiting...); } else { process::exit(0); } }).expect(Error setting Ctrl-C handler);第一次 Ctrl-C 打印提示并开始收尾第二次直接退出既给了程序缓冲时间也保证用户随时能强制终止体验非常友好。还想处理 SIGTERM 和 SIGHUP开启 termination feature如果你的程序运行在服务器上还会收到kill命令发出的SIGTERM信号、终端断开时的SIGHUP信号。rust-ctrlc 提供了terminationfeature一键扩展[dependencies] ctrlc { version 3.5, features [termination] }开启后同一个回调会自动处理SIGINT、SIGTERM和SIGHUP三种信号跨平台的行为细节定义在 src/signal.rs 中Windows 平台还额外映射了控制台关闭事件相关实现见 src/platform/windows/mod.rs 与 src/platform/unix/mod.rs。新手最容易踩的 3 个坑只能注册一个 handlerset_handler只能调用一次重复调用会返回MultipleHandlers错误。如果需要更精细的多种信号控制可以了解try_set_handler或更底层的 signal-hook 类库。回调里别做重活回调运行在专用信号线程中应保持轻量发个消息、置个标志位耗时操作交给主线程完成。错误处理别忽略set_handler返回Result系统调用失败时会返回具体的错误信息见 src/error.rs务必用expect或?处理。总结rust-ctrlc 用极低的成本解决了 Rust CLI 程序「优雅退出」这个高频需求一个函数、一个回调、跨平台开箱即用。想亲手体验可以git clone https://gitcode.com/gh_mirrors/ru/rust-ctrlc查看完整源码与测试用例立刻让你的命令行工具变得专业又可靠 【免费下载链接】rust-ctrlcEasy Ctrl-C handler for Rust projects项目地址: https://gitcode.com/gh_mirrors/ru/rust-ctrlc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

obsidian-enhancing-mindmap 设置项深度解析:画布、字体、层级与颜色调优攻略

obsidian-enhancing-mindmap 设置项深度解析:画布、字体、层级与颜色调优攻略

obsidian-enhancing-mindmap 设置项深度解析:画布、字体、层级与颜色调优攻略 【免费下载链接】obsidian-enhancing-mindmap obsidian plugin editable mindmap,you can edit mindmap on markdown file 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-enh…

📅 2026/10/7 6:15:11
什么是AMA Protocol:首个为AI智能体打造的隐私Layer 1区块链完整解析

什么是AMA Protocol:首个为AI智能体打造的隐私Layer 1区块链完整解析

什么是AMA Protocol:首个为AI智能体打造的隐私Layer 1区块链完整解析 【免费下载链接】node 项目地址: https://gitcode.com/GitHub_Trending/node95/node AMA Protocol 是一个专门为 AI 智能体(AI Agent)设计的隐私 Layer 1 区块链&…

📅 2026/10/8 16:31:06
Java 大厂面试实录:Spring Boot + Kafka + Redis + AI 检索增强生成,燕双非的三轮翻车现场

Java 大厂面试实录:Spring Boot + Kafka + Redis + AI 检索增强生成,燕双非的三轮翻车现场

互联网大厂 Java 面试实录:燕双非的三轮挑战场景:某互联网大厂 Java 面试现场,候选人燕双非,面试官语气严肃但偶尔会引导。本文以真实面试对话风格呈现,最后附详细解析。第一轮:基础架构与核心链路面试官&a…

📅 2026/10/7 13:14:12
MORE NEWS

更多资讯

📰

NC65主子表单据开发:UAP向导生成全流程与避坑指南

简介:用友UAP NC65开发主子表单据的完整实操指南,面向刚入门的ERP二次开发人员,解决从数据库建表、界面布局到前后台联动交互的落地难题。资源围绕“主子表单据”这一典型场景,给出可运行工程与源码解析,涵盖主表/子表…

📰

Nutanix超融合中文操作手册:集群运维决策树与实战避坑指南

简介:本资源为Nutanix超融合平台官方中文操作使用手册,面向IT基础设施管理员、系统运维工程师及虚拟化技术实施人员,旨在系统性指导用户完成平台日常管理与关键运维任务。手册内容覆盖登录认证、Prism主页仪表盘监控(含CPU/内存/磁…

📰

8086循环程序设计:LOOPZ与REPZ CMPSB的取舍与调试

简介:这份微机原理与接口技术课程的循环程序设计实验报告资源,面向计算机专业学生及需要掌握汇编循环控制技术的初学者。资源以doc文档形式完整呈现实验目的、验证题与设计题源码、调试分析及实验报告内容,重点讲解重复控制指令、串操作指令和…

📰

烽火交换机配置实战:带外登录、VLAN划分与IPTV组播排错

简介:面向烽火网络交换机运维与调试人员的配置文档,围绕设备开局、VLAN 划分与业务开通等实际场景,梳理从物理连接到命令下发的完整流程,适合网络工程初学者与一线装维人员对照实践。文件为单个 doc,压缩包约 567KB&am…

📰

LLT低延迟趋势线:二阶滤波实现趋势信号实时化

简介:本资源是广发证券2017年发布的金融工程专题研究报告《低延迟趋势线与交易择时1》,面向量化交易者、技术分析从业者及金融工程学习者,聚焦解决传统移动平均线(MA)在快速市场中响应滞后、择时失准的核心痛点。报告原…

📰

华为OLT接入网开局实战:FTTH场景ONT配置与排障流程

简介:面向网络管理员与接入网工程师的华为OLT配置参考手册,聚焦高速宽带接入与业务承载的落地配置。内容围绕专线业务、VPLS、FTTx/FTTH、FTTB/FTTC等模块展开,既有QinQ VLAN专线、VLAN Stacking批发、PWE3仿真等专线示例,也涵盖V…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬