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

时间:2014-02-05 06:00:20

标签: system rust

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

我意识到当用户输入exit并退出循环时我可能会返回一个布尔值,但我想至少知道Rust是否有办法提前终止程序,类似于Java {{1这对某些类型的程序很有用。

2 个答案:

答案 0 :(得分:39)

Rust 1.0稳定

std::process::exit()正是如此 - 它使用指定的退出代码终止程序:

use std::process;

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

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

替代(不推荐)解决方案

您可以直接使用C API。将libc = "0.2"添加到Cargo.toml,然后:

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

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

答案 1 :(得分:-1)

panic!("Oh no something bad has happened!")

示例:

    if a * g < 0f32 { panic!("The arithmetric-geometric mean is undefined for numbers less than zero!"); }

在较旧的文档中,您会看到此失败!(“哦,这里没有发生任何不好的事情。”)

出于某种原因,这个宏从失败变为恐慌。如果必须的话,恐慌是失败的方法。

[编辑]对不起。看起来你应该测试字符串“exit”的输入,这取决于你如何输入(按行或通过args)。然后,您可以在检测到退出的情况下让程序脱离循环。

示例:

loop {
    if exit_found { break }
    else {
        // your thing, which also looks for exit_found
    }
}