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-handle | |
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-handle')
-rw-r--r-- | meap/meap-code/ch10/ch10-handle/Cargo.toml | 7 | ||||
-rw-r--r-- | meap/meap-code/ch10/ch10-handle/src/main.rs | 48 |
2 files changed, 55 insertions, 0 deletions
diff --git a/meap/meap-code/ch10/ch10-handle/Cargo.toml b/meap/meap-code/ch10/ch10-handle/Cargo.toml new file mode 100644 index 0000000..95fa6c0 --- /dev/null +++ b/meap/meap-code/ch10/ch10-handle/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "ch10-handle" +version = "0.1.0" +authors = ["Tim McNamara <code@timmcnamara.co.nz>"] + +[dependencies] +libc = "0.2"
\ No newline at end of file diff --git a/meap/meap-code/ch10/ch10-handle/src/main.rs b/meap/meap-code/ch10/ch10-handle/src/main.rs new file mode 100644 index 0000000..d40e329 --- /dev/null +++ b/meap/meap-code/ch10/ch10-handle/src/main.rs @@ -0,0 +1,48 @@ +extern crate libc; // 0.2.42 + +use std::time::{Duration}; +use std::thread::{sleep}; +use libc::{signal,raise}; +use libc::{SIG_DFL, SIG_IGN, SIGTERM, SIGHUP}; + +type handler_ptr = extern "C" fn(i32) -> (); + +static mut ABORT: bool = false; + +#[inline(never)] +extern "C" fn handle_signals(sig: i32) { // rustc will warn that that this code is never run + let handle_signals_ptr: handler_ptr = handle_signals; + unsafe { // set the signal handler again, to prevent it resetting to SIG_DFL + signal(SIGTERM, std::mem::transmute(handle_signals_ptr)); + } + + let should_abort = match sig { + SIGTERM => true, + SIGHUP => false, + _ => false, + }; + + unsafe { // make a quick update here, and defer the real work to somewhere else + ABORT = should_abort; + } +} + +fn main() { + let delay = Duration::from_secs(1); + + // "main loop" + for i in 1..=60 { + unsafe { // at every step, check to see if a signal has been sent + if ABORT { + break; + } + } + + sleep(delay); + println!(". {}", i); + + if i > 2 { + unsafe { raise(SIGTERM); } + } + } +}
\ No newline at end of file |