//! A small example of how to listen for two signals at the same time extern crate futures; extern crate tokio; extern crate tokio_signal; // A trick to not fail build on non-unix platforms when using unix-specific features. #[cfg(unix)] mod platform { use futures::{Future, Stream}; use tokio_signal::unix::{Signal, SIGINT, SIGTERM}; pub fn main() -> Result<(), Box<::std::error::Error>> { // Create a stream for each of the signals we'd like to handle. let sigint = Signal::new(SIGINT).flatten_stream(); let sigterm = Signal::new(SIGTERM).flatten_stream(); // Use the `select` combinator to merge these two streams into one let stream = sigint.select(sigterm); // Wait for a signal to arrive println!("Waiting for SIGINT or SIGTERM"); println!( " TIP: use `pkill -sigint multiple` from a second terminal \ to send a SIGINT to all processes named 'multiple' \ (i.e. this binary)" ); let (item, _rest) = ::tokio::runtime::current_thread::block_on_all(stream.into_future()) .map_err(|_| "failed to wait for signals")?; // Figure out which signal we received let item = item.ok_or("received no signal")?; if item == SIGINT { println!("received SIGINT"); } else { assert_eq!(item, SIGTERM); println!("received SIGTERM"); } Ok(()) } } #[cfg(not(unix))] mod platform { pub fn main() -> Result<(), Box<::std::error::Error>> { Ok(()) } } fn main() -> Result<(), Box> { platform::main() }