如何从主函数外部提前退出Rust程序?

zep*_*ble 32 system rust

我正在bashRust 中编写一个克隆.我需要在用户输入时退出程序exit.在我的程序的前几次迭代中,在添加更复杂的功能之前,我曾经return离开了提示用户输入的循环.这个逻辑现在处于一个函数中,因为我实现内置shell函数的方式,所以当我return只是跳出函数回到控制循环中,而不是短路控制循环和结束程序.

我意识到当用户键入exit并退出循环时我可能会返回一个布尔值,但我想至少知道Rust是否有一种方法可以提前终止程序,类似于Java System.exit(),因为这对某些类型的程序很有用.

Vla*_*eev 46

Rust 1.0稳定

std::process::exit() 确切地说 - 它使用指定的退出代码终止程序:

use std::process;

fn main() {
    for i in 0..10 {
        if i == 5 {
            process::exit(1);
        }
        println!("{}", i);
    }
}
Run Code Online (Sandbox Code Playgroud)

此函数使程序立即终止,无需展开和运行析构函数,因此应谨慎使用.

替代(不推荐)解决方案

您可以直接使用C API.添加libc = "0.2"Cargo.toml,和:

fn main() {
    for i in 0..10 {
        if i == 5 {
            unsafe { libc::exit(1); }
        }
        println!("{}", i);
    }
}
Run Code Online (Sandbox Code Playgroud)

Rust编译器无法验证调用C函数,因此需要unsafe块.程序使用的资源将无法正确释放.这可能会导致悬挂插座等问题.据我所知,退出程序的正确方法是以某种方式终止所有线程,然后进程将自动退出.

  • 使用`libc :: exit`是个坏主意**.它不会干净地终止该过程并且可能危险地破坏事物.正常生锈过程结论*必须*涉及堆栈展开以便调用析构函数,而`exit(3)`的结束方法是完全不同的,并且不涉及堆栈展开.因此,如果您有像打开文件这样的东西,它们可能无法刷新和关闭,TCP绑定套接字可能无法正确释放(这意味着您无法绑定到套接字,直到超时到期,可能一分钟左右),&c. - `libc :: exit`基本上等同于段错误,而不是干净的退出. (6认同)
  • @ChrisMorgan,是的,我期待类似的事情。但我找不到其他方法。Rust 是否提供了一种干净地终止当前任务而不会失败的方法?或者有其他方法来停止该过程?编辑:哦,抱歉,没有看到您对这个问题的评论。太可惜了... (3认同)
  • @ChrisMorgan 套接字绑定由操作系统处理;一旦你退出,它就会清理干净。您可以立即重新绑定。不过,文件缓冲区没有被刷新确实是有效的。 (2认同)