[英]How to catch signals in Rust
我正在尝试编写一些能够捕获SIGTERM信号的代码。
我找到了这个 ,我还发现了如何处理Rust中的阻塞i / o,或者一般来说长时间运行外部函数调用 。
但是在当前的Rust版本(每晚0.12)中,似乎删除了std::io::signal::Listener
。 它被放在别的地方吗? 如果是这样,有人会指出我如何捕捉信号?
在撰写本答案时,有一个内置信号的RFC 。
我使用chan-signal
板箱取得了一些成功:
#[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.
}
现在看来实现这一点现在相当简单。 Rust中命令行应用程序的信号处理部分介绍了这个概念,并提到了ctrlc包以处理该特定信号,以及信号挂钩包以处理信号。
通过指南,信号钩,它应该是这样简单:
use std::{error::Error, thread};
use signal_hook::{iterator::Signals, SIGTERM};
fn main() -> Result<(), Box<Error>> {
let signals = Signals::new(&[SIGTERM])?;
thread::spawn(move || {
for sig in signals.forever() {
println!("Received signal {:?}", sig);
}
});
Ok(())
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.