40个版本

0.3.17 2023年7月18日
0.3.15 2023年2月11日
0.3.14 2022年5月16日
0.3.13 2021年12月20日
0.1.2 2018年7月15日

#5操作系统

Download history 498489/week @ 2024-04-22 468081/week @ 2024-04-29 466359/week @ 2024-05-06 496462/week @ 2024-05-13 492089/week @ 2024-05-20 464308/week @ 2024-05-27 502890/week @ 2024-06-03 515419/week @ 2024-06-10 491981/week @ 2024-06-17 492765/week @ 2024-06-24 459034/week @ 2024-07-01 505730/week @ 2024-07-08 506093/week @ 2024-07-15 537425/week @ 2024-07-22 518956/week @ 2024-07-29 525225/week @ 2024-08-05

2,116,363 每月下载量
用于 2,458 个crate (423直接)

Apache-2.0/MIT

160KB
2K SLoC

Signal-hook

Actions Status codecov docs

Rust中安全且正确处理Unix信号的库。

Unix信号由于其本质特性,处理起来很困难,原因有以下几点:

  • 它们是全局资源。如果库想要设置自己的信号处理器,它可能会打扰到其他库。虽然可以链式调用之前的信号处理器,但无法以任何实际方式从链中移除旧的处理程序。
  • 可以从任何线程中调用,需要同步。另外,它们可以在任何时候中断线程,使得大多数处理容易引发竞争条件。
  • 根据POSIX标准,在信号处理器内可能调用的函数集非常有限。重要的是,互斥锁(或其他锁定机制)以及内存分配和释放是不允许的。

该库旨在解决一些问题。它提供了信号到达时执行操作的全球注册表。可以为同一信号注册多个操作,并且可以在之后删除这些操作。如果在注册信号的第一操作时已经存在之前的信号处理器,则将其链式连接(但原始的无法移除)。

除了基本的任意操作注册之外,还提供了一些辅助操作来覆盖最常见的用例,这些操作都来自安全的Rust。

有关更多详细信息,请参阅文档

示例

(这可能在每个单独的应用程序中做很多你不需要的事情,它更多的是展示所有可能性的示例,而不是每次需要做什么)。

use std::io::Error;
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};

fn main() -> Result<(), Error> {
    let term = Arc::new(AtomicBool::new(false));
    signal_hook::flag::register(signal_hook::consts::SIGTERM, Arc::clone(&term))?;
    while !term.load(Ordering::Relaxed) {
        // Do some time-limited stuff here
        // (if this could block forever, then there's no guarantee the signal will have any
        // effect).
    }
    Ok(())
}

许可证

根据您的选择,许可协议为

贡献

除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,根据Apache-2.0许可证的定义,应如上所述双重许可,不得附加任何其他条款或条件。

依赖关系