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 在 操作系统 中
2,116,363 每月下载量
用于 2,458 个crate (423直接)
160KB
2K SLoC
Signal-hook
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,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,根据Apache-2.0许可证的定义,应如上所述双重许可,不得附加任何其他条款或条件。