#![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); } } } }