繁体   English   中英

如何在Rust中捕获信号

[英]How to catch signals in Rust

我正在尝试编写一些能够捕获SIGTERM信号的代码。

我找到了这个 ,我还发现了如何处理Rust中的阻塞i / o,或者一般来说长时间运行外部函数调用

但是在当前的Rust版本(每晚0.12)中,似乎删除了std::io::signal::Listener 它被放在别的地方吗? 如果是这样,有人会指出我如何捕捉信号?

我相信在这个拉取请求中删除了std::io::signal模块。 声称正确的信号处理从未在本机运行时正确实现,因此无论如何您可能无法使用它。 似乎是这个问题的跟踪问题。

与此同时,我认为,你必须从libc到最低级别的不安全函数。

在撰写本答案时,有一个内置信号的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM