Rust 如何捕捉锈迹中的信号
我正试图写一些代码来捕捉像SIGTERM这样的信号 我找到了,我也找到了Rust 如何捕捉锈迹中的信号,rust,Rust,我正试图写一些代码来捕捉像SIGTERM这样的信号 我找到了,我也找到了 但在当前的Rust版本(每晚0.12次)中,似乎删除了std::io::signal::Listener。它放在别的地方了吗?如果是这样,有人能告诉我如何捕捉信号吗?我相信std::io::signal模块在pull请求中被删除了。据称,本机运行时从未正确实现适当的信号处理,因此您现在可能无法使用它。似乎是此问题的跟踪问题 同时,我认为,在撰写此答案时,您必须从libc降至最低级别的不安全函数 我在以下方面取得了一些成功:
但在当前的Rust版本(每晚0.12次)中,似乎删除了
std::io::signal::Listener
。它放在别的地方了吗?如果是这样,有人能告诉我如何捕捉信号吗?我相信std::io::signal
模块在pull请求中被删除了。据称,本机运行时从未正确实现适当的信号处理,因此您现在可能无法使用它。似乎是此问题的跟踪问题
同时,我认为,在撰写此答案时,您必须从
libc
降至最低级别的不安全函数
我在以下方面取得了一些成功:
#[宏使用]
陈文杰;
外部板条箱信号;
使用chan_信号::信号;
fn main(){
//当操作系统发送INT或TERM信号时,Signal获取一个值。
let signal=chan_signal::notify(&[signal::INT,signal::TERM]);
//我们的工作完成后,在“sdone”上发送哨兵值。
let(sdone,rdone)=chan::sync(0);
//运行工作。
::std::thread::spawn(move | | run(sdone));
//等待信号或工作完成。
陈选{
signal.recv()->signal=>{
println!(“接收信号:{:?}”,信号)
},
rdone.recv()=>{
println!(“程序正常完成”);
}
}
}
fn运行(_sdone:chan::Sender){
println!(“运行工作5秒”);
println!(“你能足够快地发出信号吗?”);
//做一些工作。
:std::thread::sleep_ms(5000);
//_sdone被丢弃,关闭频道并导致'rdone`
//解除封锁。
}
现在实现这一点似乎相当简单。Rust中的命令行应用程序的定义超过了这个概念,并提到了处理特定信号的板条箱,以及处理一般信号的板条箱
通过导向器,带信号钩,其应尽可能简单:
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(())
}
使用std:{error::error,thread};
使用signal_hook::{iterator::Signals,SIGTERM};
fn main()->结果{
让信号=信号::新(&[SIGTERM])?;
线程::生成(移动| |{
对于sig in signals.forever(){
println!(“接收信号{:?}”,sig);
}
});
好(())
}
这是一个很好的关于锈病信号的概述:
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(())
}