| Crates.io | async-signal-with-info |
| lib.rs | async-signal-with-info |
| version | 0.0.1 |
| created_at | 2025-08-07 17:21:29.40125+00 |
| updated_at | 2025-08-07 17:21:29.40125+00 |
| description | Async signal handling |
| homepage | |
| repository | https://github.com/smol-rs/async-signal |
| max_upload_size | |
| id | 1785576 |
| size | 46,322 |
Asynchronous signal handling.
This crate provides the Signals type, which can be used to listen for POSIX signals asynchronously. It can be seen as an asynchronous version of signal_hook::iterator::Signals.
This is a fork of async-signal to also provide siginfo_t via the async stream. As siginfo_t is a Unix specific feature, support for Windows is also removed from the crate.
This crate uses the signal_hook_registry crate to register a listener for each signal. That listener will then send a message through a Unix socket to the Signals type, which will receive it and notify the user. Asynchronous notification is done through the futures-channel crate.
A background thread is used for reading signal messages to avoid signal losses caused by buffer overruns, which is a problem for the original crate.
use async_signal::{Signal, Signals};
use futures_lite::prelude::*;
use signal_hook::low_level;
// Register the signals we want to receive.
let mut signals = Signals::new([
Signal::Term,
Signal::Quit,
Signal::Int,
])?;
// Wait for a signal to be received.
while let Some((signal, siginfo)) = signals.next().await {
// Print the signal.
eprintln!("Received signal {:?} {:p}", signal, unsafe { siginfo.si_value().sigval_ptr });
// After printing it, do whatever the signal was supposed to do in the first place.
low_level::emulate_default_handler(signal.unwrap() as i32).unwrap();
}
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.