How do I exit a Rust program early from outside the main function?

前端 未结 2 1063
故里飘歌
故里飘歌 2020-12-30 19:11

I am in the process of writing a bash clone in Rust. I need to have my program exit when the user types exit. In previous iterations of my progra

相关标签:
2条回答
  • 2020-12-30 19:39

    Rust 1.0 stable

    std::process::exit() does exactly that - it terminates the program with the specified exit code:

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

    This function causes the program to terminate immediately, without unwinding and running destructors, so it should be used sparingly.

    Alternative (not recommended) solution

    You can use C API directly. Add libc = "0.2" to Cargo.toml, and:

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

    Calling C functions cannot be verified by the Rust compiler, so this requires the unsafe block. Resources used by the program will not be freed properly. This may cause problems such as hanging sockets. As far as I understand, the proper way to exit from the program is to terminate all threads somehow, then the process will exit automatically.

    0 讨论(0)
  • 2020-12-30 19:46
    panic!("Oh no something bad has happened!")
    

    Example:

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

    In older documentation, you will see this as fail!("Oh no something bad here has happened.")

    For some reason, this macro was changed from fail to panic. Panic is the way to fail, if you must.

    [edit] I am sorry. It looks like you should be testing input for the string "exit," which would depend on how you are taking input (by line or by args). Then you can have the program break out of the loop on the condition that the exit is detected.

    Example:

    loop {
        if exit_found { break }
        else {
            // your thing, which also looks for exit_found
        }
    }
    
    0 讨论(0)
提交回复
热议问题