summaryrefslogtreecommitdiff
path: root/meap/meap-code/ch10/ch10-handler
diff options
context:
space:
mode:
Diffstat (limited to 'meap/meap-code/ch10/ch10-handler')
-rwxr-xr-xmeap/meap-code/ch10/ch10-handler/Cargo.toml7
-rwxr-xr-xmeap/meap-code/ch10/ch10-handler/src/main.rs58
2 files changed, 65 insertions, 0 deletions
diff --git a/meap/meap-code/ch10/ch10-handler/Cargo.toml b/meap/meap-code/ch10/ch10-handler/Cargo.toml
new file mode 100755
index 0000000..7c8ed67
--- /dev/null
+++ b/meap/meap-code/ch10/ch10-handler/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "ch10-handler"
+version = "0.1.0"
+authors = ["Tim McNamara <code@timmcnamara.co.nz>"]
+
+[dependencies]
+libc = "0.2"
diff --git a/meap/meap-code/ch10/ch10-handler/src/main.rs b/meap/meap-code/ch10/ch10-handler/src/main.rs
new file mode 100755
index 0000000..088c9e6
--- /dev/null
+++ b/meap/meap-code/ch10/ch10-handler/src/main.rs
@@ -0,0 +1,58 @@
+#![cfg(not(windows))]
+
+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;
+
+#[inline]
+fn register_signal_handler() {
+ let fn_ptr: fn(i32) -> () = handle_signals; // <1> hardcoding for simplicity
+
+ unsafe {
+ let fn_ptr_as_usize: usize = mem::transmute(fn_ptr); // <2>
+ libc::signal(SIGTERM, fn_ptr_as_usize); // <3>
+ }
+}
+
+#[allow(dead_code)] // <4>
+fn handle_signals(sig: i32) {
+ register_signal_handler();
+
+ unsafe { // <4>
+ SHUT_DOWN = match sig { // <5>
+ SIGALRM => false, // <5>
+ SIGHUP => false, // <5>
+ SIGTERM => true, // <5>
+ SIGQUIT => true, // <5>
+ _ => false, // <5>
+ };
+ }
+}
+
+fn main() {
+ register_signal_handler();
+ let delay = time::Duration::from_secs(1);
+
+ for i in 1.. { // <6>
+ unsafe { // <6>
+ if SHUT_DOWN {
+ println!(); // only print a newline character
+ return;
+ }
+ }
+
+ sleep(delay);
+ print!(".");
+
+ if i > 3 {
+ unsafe {
+ libc::raise(SIGTERM);
+ }
+ }
+ }
+} \ No newline at end of file