summaryrefslogblamecommitdiff
path: root/meap/meap-code/ch10/ch10-basic-handler/src/main.rs
blob: a7ecb33c6b3009d77395ff315893da460f5fd6c7 (plain) (tree)

























































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