Skip to main content

v_module_queue/
signals.rs

1use crossbeam_channel::{bounded, Receiver};
2use signal_hook::consts::signal::*;
3use signal_hook::consts::{SIGCONT, SIGTSTP};
4use signal_hook::iterator::Signals;
5use signal_hook::low_level;
6use std::io::Error;
7use std::os::raw::c_int;
8use std::thread;
9
10const SIGNALS: &[c_int] = &[SIGTERM, SIGQUIT, SIGINT, SIGTSTP, SIGCONT];
11
12pub fn sys_sig_listener() -> Result<Receiver<i32>, Error> {
13    let (sender, receiver) = bounded(1);
14    thread::spawn(move || {
15        info!("Start system signal listener");
16        let mut sigs = Signals::new(SIGNALS).unwrap();
17        for signal in &mut sigs {
18            warn!("Received signal {:?}", signal);
19
20            if signal != SIGTERM {
21                low_level::emulate_default_handler(signal).unwrap();
22            }
23
24            let _ = sender.send(signal);
25        }
26    });
27    Ok(receiver)
28}