v_module_queue/
signals.rs1use 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}