16 个版本

0.3.0-alpha.12019 年 8 月 8 日
0.2.9 2020 年 2 月 5 日
0.2.8 2019 年 3 月 22 日
0.2.7 2018 年 11 月 22 日
0.1.0 2016 年 9 月 10 日

#17 in #ctrl-c

Download history 2882/week @ 2024-03-14 3489/week @ 2024-03-21 3911/week @ 2024-03-28 3412/week @ 2024-04-04 4151/week @ 2024-04-11 4126/week @ 2024-04-18 4524/week @ 2024-04-25 4064/week @ 2024-05-02 4092/week @ 2024-05-09 4356/week @ 2024-05-16 4057/week @ 2024-05-23 4461/week @ 2024-05-30 3921/week @ 2024-06-06 3758/week @ 2024-06-13 3793/week @ 2024-06-20 2853/week @ 2024-06-27

14,983 个月下载
152 个 (22 直接) 仓库中使用

MIT 许可证

585KB
10K SLoC

tokio-signal

为 Tokio 实现的 Unix 信号处理。

许可证

本项目根据 MIT 许可证 许可。

贡献

除非你明确声明,否则你提交给 Tokio 的任何有意包含的贡献,都应按 MIT 许可,不附加任何额外条款或条件。


lib.rs:

为 Tokio 实现的异步信号处理

该包实现了为 Tokio(Rust 中的异步 I/O 框架)提供的异步信号处理。该包导出的主要类型 unix::Signal 允许在 Unix 平台上监听任意信号,并以异步方式接收它们。

请注意,信号处理通常是一个非常复杂的话题,应该谨慎使用。该包尝试实现信号处理的“最佳实践”,但您应该根据您自己的应用程序需求对其进行评估,以确定其是否适用。

该包在 Signal 结构中记录了一些基本限制。

示例

打印出所有接收到的 Ctrl-C 通知

#![feature(async_await)]

use futures_util::future;
use futures_util::stream::StreamExt;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create an infinite stream of "Ctrl+C" notifications. Each item received
    // on this stream may represent multiple ctrl-c signals.
    let ctrl_c = tokio_signal::CtrlC::new()?;

    // Process each ctrl-c as it comes in
    let prog = ctrl_c.for_each(|_| {
        println!("ctrl-c received!");
        future::ready(())
    });

    prog.await;

    Ok(())
}

在 Unix 上等待 SIGHUP

#![feature(async_await)]

use futures_util::future;
use futures_util::stream::StreamExt;
use tokio_signal::unix::{Signal, SIGHUP};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create an infinite stream of "Ctrl+C" notifications. Each item received
    // on this stream may represent multiple ctrl-c signals.
    let ctrl_c = tokio_signal::CtrlC::new()?;

    // Process each ctrl-c as it comes in
    let prog = ctrl_c.for_each(|_| {
        println!("ctrl-c received!");
        future::ready(())
    });

    prog.await;

    // Like the previous example, this is an infinite stream of signals
    // being received, and signals may be coalesced while pending.
    let stream = Signal::new(SIGHUP)?;

    // Convert out stream into a future and block the program
    let (signal, _signal) = stream.into_future().await;
    println!("got signal {:?}", signal);
    Ok(())
}

依赖关系

~3MB
~50K SLoC