• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! Some low level utilities
2 //!
3 //! More often to build other abstractions than used directly.
4 
5 use std::io::Error;
6 
7 use libc::c_int;
8 
9 #[cfg(feature = "channel")]
10 #[cfg_attr(docsrs, doc(cfg(feature = "channel")))]
11 pub mod channel;
12 #[cfg(not(windows))]
13 #[cfg_attr(docsrs, doc(cfg(not(windows))))]
14 pub mod pipe;
15 #[cfg(feature = "extended-siginfo-raw")]
16 #[cfg_attr(docsrs, doc(cfg(feature = "extended-siginfo-raw")))]
17 pub mod siginfo;
18 mod signal_details;
19 
20 pub use signal_hook_registry::{register, unregister};
21 
22 pub use self::signal_details::{emulate_default_handler, signal_name};
23 
24 /// The usual raise, just the safe wrapper around it.
25 ///
26 /// This is async-signal-safe.
raise(sig: c_int) -> Result<(), Error>27 pub fn raise(sig: c_int) -> Result<(), Error> {
28     let result = unsafe { libc::raise(sig) };
29     if result == -1 {
30         Err(Error::last_os_error())
31     } else {
32         Ok(())
33     }
34 }
35 
36 /// A bare libc abort.
37 ///
38 /// Unlike the [std::process::abort], this one is guaranteed to contain no additions or wrappers
39 /// and therefore is async-signal-safe. You can use this to terminate the application from within a
40 /// signal handler.
abort() -> !41 pub fn abort() -> ! {
42     unsafe {
43         libc::abort();
44     }
45 }
46 
47 /// A bare libc exit.
48 ///
49 /// Unlike the [std::process::exit], this one is guaranteed to contain no additions or wrappers and
50 /// therefore is async-signal-safe. You can use this to terminate the application from within a
51 /// signal handler.
52 ///
53 /// Also, see [`register_conditional_shutdown`][crate::flag::register_conditional_shutdown].
exit(status: c_int) -> !54 pub fn exit(status: c_int) -> ! {
55     unsafe {
56         // Yes, the one with underscore. That one doesn't call the at-exit hooks.
57         libc::_exit(status);
58     }
59 }
60