我想寫一些代碼,將捕獲像SIGTERM的信號。我發現this,我也發現How to handle blocking i/o in Rust, or long running external function calls in general。如何捕獲鏽信號
但是在目前的Rust版本(0.12每晚)中,似乎std::io::signal::Listener
已被刪除。它被放到別的地方了嗎?如果有的話,有人可以指示我如何捕捉信號?
我想寫一些代碼,將捕獲像SIGTERM的信號。我發現this,我也發現How to handle blocking i/o in Rust, or long running external function calls in general。如何捕獲鏽信號
但是在目前的Rust版本(0.12每晚)中,似乎std::io::signal::Listener
已被刪除。它被放到別的地方了嗎?如果有的話,有人可以指示我如何捕捉信號?
在寫這個答案時,有an RFC for built-in signals。
我不得不使用the chan-signal
crate一些成功:
#[macro_use]
extern crate chan;
extern crate chan_signal;
use chan_signal::Signal;
fn main() {
// Signal gets a value when the OS sent a INT or TERM signal.
let signal = chan_signal::notify(&[Signal::INT, Signal::TERM]);
// When our work is complete, send a sentinel value on `sdone`.
let (sdone, rdone) = chan::sync(0);
// Run work.
::std::thread::spawn(move || run(sdone));
// Wait for a signal or for work to be done.
chan_select! {
signal.recv() -> signal => {
println!("received signal: {:?}", signal)
},
rdone.recv() => {
println!("Program completed normally.");
}
}
}
fn run(_sdone: chan::Sender<()>) {
println!("Running work for 5 seconds.");
println!("Can you send a signal quickly enough?");
// Do some work.
::std::thread::sleep_ms(5000);
// _sdone gets dropped which closes the channel and causes `rdone`
// to unblock.
}