如何让编译后的Rust程序运行结束后不立即自动关闭?
实现Rust程序执行结束后等待用户按键再退出的方案
你可以通过标准库或分平台适配实现该效果,以下是不同场景的可用实现:
方案1:标准库跨平台实现(等待回车退出,无第三方依赖)
直接使用Rust标准库的std::io模块读取用户输入即可,兼容所有Rust支持的平台,适合大多数测试场景:
use std::io; fn main() { // 你的业务逻辑代码写在此处 println!("程序执行完成"); println!("按回车键退出..."); let mut discard_buffer = String::new(); // 读取一行输入,用户按下回车后程序继续执行退出逻辑 io::stdin().read_line(&mut discard_buffer).unwrap(); }
方案2:按任意键退出(无需按回车,分平台适配)
Rust标准库没有提供跨平台的无缓冲单字符读取能力,需要针对不同平台做适配:
use std::io; #[cfg(windows)] fn wait_any_key() { use std::ptr; use winapi::um::consoleapi::ReadConsoleInputW; use winapi::um::processenv::GetStdHandle; use winapi::um::winbase::STD_INPUT_HANDLE; use winapi::um::wincon::{INPUT_RECORD, KEY_EVENT}; let stdin_handle = unsafe { GetStdHandle(STD_INPUT_HANDLE) }; let mut input_record = INPUT_RECORD::default(); let mut read_count = 0; println!("按任意键退出..."); loop { unsafe { ReadConsoleInputW(stdin_handle, &mut input_record, 1, &mut read_count) }; if input_record.EventType == KEY_EVENT && unsafe { input_record.Event.KeyEvent().bKeyDown } != 0 { break; } } } #[cfg(unix)] fn wait_any_key() { use std::io::Read; use termios::{tcsetattr, Termios, ECHO, ICANON, TCSANOW}; let stdin_fd = 0; let mut term_attr = Termios::from_fd(stdin_fd).unwrap(); // 关闭终端的行缓冲和回显,实现无缓冲读取单个按键 term_attr.c_lflag &= !(ICANON | ECHO); tcsetattr(stdin_fd, TCSANOW, &term_attr).unwrap(); println!("按任意键退出..."); let mut single_key_buf = [0u8; 1]; io::stdin().read_exact(&mut single_key_buf).unwrap(); // 恢复终端原有属性 term_attr.c_lflag |= ICANON | ECHO; tcsetattr(stdin_fd, TCSANOW, &term_attr).unwrap(); } fn main() { // 你的业务逻辑代码写在此处 println!("程序执行完成"); wait_any_key(); }
需要在Cargo.toml中添加对应平台的依赖:
[dependencies] # Windows平台依赖 winapi = { version = "0.3", features = ["consoleapi", "processenv", "winbase", "wincon"] } # 类Unix平台依赖 termios = "0.3"
方案3:Windows平台快捷实现
如果仅在Windows下测试,可以直接调用系统的pause命令,代码更简洁:
use std::process::Command; fn main() { // 你的业务逻辑代码写在此处 println!("程序执行完成"); Command::new("cmd").args(&["/C", "pause"]).status().unwrap(); }
内容的提问来源于stack exchange,提问作者user17068379
相关产品推荐
相关产品推荐

