mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-28 09:44:08 +00:00
std: Add a process::exit function
This commit is an implementation of [RFC #1011][rfc] which adds an `exit` function to the standard library for immediately terminating the current process with a specified exit code. [rfc]: https://github.com/rust-lang/rfcs/pull/1011
This commit is contained in:
parent
80bf31dd51
commit
71982aa657
@ -527,6 +527,22 @@ impl Child {
|
||||
}
|
||||
}
|
||||
|
||||
/// Terminates the current process with the specified exit code.
|
||||
///
|
||||
/// This function will never return and will immediately terminate the current
|
||||
/// process. The exit code is passed through to the underlying OS and will be
|
||||
/// available for consumption by another process.
|
||||
///
|
||||
/// Note that because this function never returns, and that it terminates the
|
||||
/// process, no destructors on the current stack or any other thread's stack
|
||||
/// will be run. If a clean shutdown is needed it is recommended to only call
|
||||
/// this function at a known point where there are no more destructors left
|
||||
/// to run.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn exit(code: i32) -> ! {
|
||||
::sys::os::exit(code)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use io::ErrorKind;
|
||||
|
@ -505,3 +505,7 @@ pub fn home_dir() -> Option<PathBuf> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn exit(code: i32) -> ! {
|
||||
unsafe { libc::exit(code as c_int) }
|
||||
}
|
||||
|
@ -433,6 +433,7 @@ extern "system" {
|
||||
TokenHandle: *mut libc::HANDLE) -> libc::BOOL;
|
||||
pub fn GetCurrentProcess() -> libc::HANDLE;
|
||||
pub fn GetStdHandle(which: libc::DWORD) -> libc::HANDLE;
|
||||
pub fn ExitProcess(uExitCode: libc::UINT) -> !;
|
||||
}
|
||||
|
||||
#[link(name = "userenv")]
|
||||
|
@ -379,3 +379,7 @@ pub fn home_dir() -> Option<PathBuf> {
|
||||
}, super::os2path).ok()
|
||||
})
|
||||
}
|
||||
|
||||
pub fn exit(code: i32) -> ! {
|
||||
unsafe { libc::ExitProcess(code as libc::UINT) }
|
||||
}
|
||||
|
31
src/test/run-pass/process-exit.rs
Normal file
31
src/test/run-pass/process-exit.rs
Normal file
@ -0,0 +1,31 @@
|
||||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use std::env;
|
||||
use std::process::{self, Command, Stdio};
|
||||
|
||||
fn main() {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
if args.len() > 1 && args[1] == "child" {
|
||||
child();
|
||||
} else {
|
||||
parent();
|
||||
}
|
||||
}
|
||||
|
||||
fn parent() {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
let status = Command::new(&args[0]).arg("child").status().unwrap();
|
||||
assert_eq!(status.code(), Some(2));
|
||||
}
|
||||
|
||||
fn child() -> i32 {
|
||||
process::exit(2);
|
||||
}
|
Loading…
Reference in New Issue
Block a user