# CtrlC2
[![Version](https://img.shields.io/crates/v/ctrlc2.svg?style=flat)](https://crates.io/crates/ctrlc2)
[![Documentation](https://img.shields.io/badge/docs-release-brightgreen.svg?style=flat)](https://docs.rs/ctrlc2)
[![Download](https://img.shields.io/crates/d/ctrlc2.svg)](https://crates.io/crates/ctrlc2)
[![License](https://img.shields.io/crates/l/ctrlc2.svg?style=flat)](https://github.com/ssrlive/ctrlc2/blob/master/LICENSE-MIT)
> For [this reason](https://github.com/Detegr/rust-ctrlc/pull/110), I have decided to create a fork of [ctrlc](https://github.com/Detegr/rust-ctrlc) and maintain it.
> I will try to keep it up to date with the original repo. If you have any suggestions or want to contribute, please open an issue or a PR. Thanks!
> I will respond to issues and PRs as soon as possible.
A simple easy to use wrapper around Ctrl-C signal.
[Documentation](https://docs.rs/ctrlc2/)
## Example usage
In `cargo.toml`:
```toml
[dependencies]
ctrlc2 = "3.5"
```
then, in `main.rs`
```rust
use std::sync::mpsc::channel;
use ctrlc2;
fn main() {
let (tx, rx) = channel();
let handle = ctrlc2::set_handler(move || {tx.send(()).expect("Could not send signal on channel."); true})
.expect("Error setting Ctrl-C handler");
println!("Waiting for Ctrl-C...");
rx.recv().expect("Could not receive from channel.");
println!("Got it! Exiting...");
handle.join().unwrap();
}
```
### Asynchronous support
This library now supports asynchronous operation using either the tokio runtimes.
Selecting the tokio is done using feature flags (e.g. --no-default-features --features tokio)
```rust
#[cfg(feature = "tokio")]
#[cfg_attr(feature = "tokio", tokio::main(flavor = "current_thread"))]
async fn main() {
let (tx, mut rx) = tokio::sync::mpsc::channel::<()>(1);
ctrlc2::set_async_handler(async move {
tx.send(())
.await
.expect("Could not send signal on channel.");
})
.await;
println!("Waiting for Ctrl-C...");
rx.recv().await.expect("Could not receive from channel.");
println!("Got it! Exiting...");
}
```
#### Try the example yourself
`cargo build --examples && target/debug/examples/readme_example`
## Handling SIGTERM and SIGHUP
Add CtrlC to Cargo.toml using `termination` feature and CtrlC will handle SIGINT, SIGTERM and SIGHUP.
## License
Licensed under either of
* Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
### Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you shall be dual licensed as above, without any
additional terms or conditions.
## Similar crates
There are alternatives that give you more control over the different signals and/or add async support.
- [signal-hook](https://github.com/vorner/signal-hook)
- [tokio::signal](https://docs.rs/tokio/latest/tokio/signal/index.html)