From 67cdcc2e12118becb823e20a40cc2687f2b8425a Mon Sep 17 00:00:00 2001 From: Adam Carpenter <53hornet@gmail.com> Date: Wed, 27 Mar 2019 15:32:37 -0400 Subject: Started Rust in Action MEAP. --- meap/meap-code/ch10/ch10-handler/Cargo.toml | 7 ++++ meap/meap-code/ch10/ch10-handler/src/main.rs | 58 ++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 meap/meap-code/ch10/ch10-handler/Cargo.toml create mode 100644 meap/meap-code/ch10/ch10-handler/src/main.rs (limited to 'meap/meap-code/ch10/ch10-handler') diff --git a/meap/meap-code/ch10/ch10-handler/Cargo.toml b/meap/meap-code/ch10/ch10-handler/Cargo.toml new file mode 100644 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 "] + +[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 100644 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 -- cgit v1.2.3