You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让编译后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:39:03