A cross platform crate for interrupting or terminating child processes
cargo add send_ctrlc # Or for async/tokio: cargo add send_ctrlc -F tokio- Cross platform (including Windows)
- Uniform cross platform API
- Both sync and async
- Only 2 unsafe calls
- Minimal dependencies:
- Synchronous:
libcon unix, andwindows-syson windows - Asynchronous:
tokio(with onlyprocessfeature)
- Synchronous:
The first example below is for synchronous use cases and the second for tokio/async use cases. However, both
interruptandterminateare available for both sync/async code.
use send_ctrlc::{Interruptible as _, InterruptibleCommand as _}; // Interrupt example #[cfg(not(feature = "tokio"))] fn main() { // Create a continuous ping standard command let mut command = std::process::Command::new("ping"); #[cfg(windows)] command.arg("-t"); command.arg("127.0.0.1"); // Spawn the ping, interrupt it, and wait for it to complete let mut child = command.spawn_interruptible().unwrap(); child.interrupt().unwrap(); child.wait().unwrap(); } // Terminate example (async/tokio) #[cfg(feature = "tokio")] #[tokio::main] async fn main() { // Create a continuous ping standard command let mut command = tokio::process::Command::new("ping"); #[cfg(windows)] command.arg("-t"); command.arg("127.0.0.1"); // Spawn the ping, interrupt it, and wait for it to complete let mut child = command.spawn_interruptible().unwrap(); child.terminate().unwrap(); child.wait().await.unwrap(); }Contributions are welcome as long they align with the vision for this crate.