diff options
author | Adam Carpenter <53hornet@gmail.com> | 2019-03-27 15:32:37 -0400 |
---|---|---|
committer | Adam Carpenter <53hornet@gmail.com> | 2019-03-27 15:32:37 -0400 |
commit | 67cdcc2e12118becb823e20a40cc2687f2b8425a (patch) | |
tree | ed92c3234b89079e6d4cf36f5e80c5ffa79def48 /meap/meap-code/ch10/ch10-basic-handler/src | |
parent | e25482fca375d318a39c3b54db396b0db6e0b263 (diff) | |
download | learning-rust-67cdcc2e12118becb823e20a40cc2687f2b8425a.tar.xz learning-rust-67cdcc2e12118becb823e20a40cc2687f2b8425a.zip |
Started Rust in Action MEAP.
Diffstat (limited to 'meap/meap-code/ch10/ch10-basic-handler/src')
-rw-r--r-- | meap/meap-code/ch10/ch10-basic-handler/src/main.rs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/meap/meap-code/ch10/ch10-basic-handler/src/main.rs b/meap/meap-code/ch10/ch10-basic-handler/src/main.rs new file mode 100644 index 0000000..a7ecb33 --- /dev/null +++ b/meap/meap-code/ch10/ch10-basic-handler/src/main.rs @@ -0,0 +1,58 @@ +#![cfg(not(windows))] // <1> + +extern crate libc; + +use std::mem; +use std::time; +use std::thread::{sleep}; +use libc::{SIGTERM, SIGALRM, SIGHUP, SIGQUIT}; + +static mut SHUT_DOWN: bool = false; + +fn register_signal_handler() { + let fn_ptr: fn(i32) -> () = handle_signals; // <2> + + unsafe { + let fn_ptr_as_usize: usize = mem::transmute(fn_ptr); // <3> + libc::signal(SIGTERM, fn_ptr_as_usize); // <4> + } +} + +#[allow(dead_code)] // <5> +fn handle_signals(sig: i32) { + register_signal_handler(); + + unsafe { // <6> + SHUT_DOWN = match sig { // <7> + SIGHUP => false, // <7> + SIGALRM => false, // <7> + SIGTERM => true, // <7> + SIGQUIT => true, // <7> + _ => false, // <7> + }; + } +} + +fn main() { + + register_signal_handler(); + let delay = time::Duration::from_secs(1); + + for i in 1_usize.. { // <7> + unsafe { // <7> + if SHUT_DOWN { + println!(); // only print a newline character + return; + } + } + + sleep(delay); + print!("{} ", i); + + if i > 10 { + unsafe { + libc::raise(SIGTERM); + } + } + } +}
\ No newline at end of file |