summaryrefslogtreecommitdiff
path: root/meap/meap-code/ch10/ch10-handle
diff options
context:
space:
mode:
authorAdam Carpenter <53hornet@gmail.com>2019-03-27 15:32:37 -0400
committerAdam Carpenter <53hornet@gmail.com>2019-03-27 15:32:37 -0400
commit67cdcc2e12118becb823e20a40cc2687f2b8425a (patch)
treeed92c3234b89079e6d4cf36f5e80c5ffa79def48 /meap/meap-code/ch10/ch10-handle
parente25482fca375d318a39c3b54db396b0db6e0b263 (diff)
downloadlearning-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.toml7
-rw-r--r--meap/meap-code/ch10/ch10-handle/src/main.rs48
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