| 1 | #[cfg (unix)] |
| 2 | use super::unix::{self as os_impl}; |
| 3 | #[cfg (windows)] |
| 4 | use super::windows::{self as os_impl}; |
| 5 | |
| 6 | use std::io; |
| 7 | |
| 8 | /// Completes when a "ctrl-c" notification is sent to the process. |
| 9 | /// |
| 10 | /// While signals are handled very differently between Unix and Windows, both |
| 11 | /// platforms support receiving a signal on "ctrl-c". This function provides a |
| 12 | /// portable API for receiving this notification. |
| 13 | /// |
| 14 | /// Once the returned future is polled, a listener is registered. The future |
| 15 | /// will complete on the first received `ctrl-c` **after** the initial call to |
| 16 | /// either `Future::poll` or `.await`. |
| 17 | /// |
| 18 | /// # Caveats |
| 19 | /// |
| 20 | /// On Unix platforms, the first time that a `Signal` instance is registered for a |
| 21 | /// particular signal kind, an OS signal-handler is installed which replaces the |
| 22 | /// default platform behavior when that signal is received, **for the duration of |
| 23 | /// the entire process**. |
| 24 | /// |
| 25 | /// For example, Unix systems will terminate a process by default when it |
| 26 | /// receives a signal generated by `"CTRL+C"` on the terminal. But, when a |
| 27 | /// `ctrl_c` stream is created to listen for this signal, the time it arrives, |
| 28 | /// it will be translated to a stream event, and the process will continue to |
| 29 | /// execute. **Even if this `Signal` instance is dropped, subsequent `SIGINT` |
| 30 | /// deliveries will end up captured by Tokio, and the default platform behavior |
| 31 | /// will NOT be reset**. |
| 32 | /// |
| 33 | /// Thus, applications should take care to ensure the expected signal behavior |
| 34 | /// occurs as expected after listening for specific signals. |
| 35 | /// |
| 36 | /// # Examples |
| 37 | /// |
| 38 | /// ```rust,no_run |
| 39 | /// use tokio::signal; |
| 40 | /// |
| 41 | /// #[tokio::main] |
| 42 | /// async fn main() { |
| 43 | /// println!("waiting for ctrl-c" ); |
| 44 | /// |
| 45 | /// signal::ctrl_c().await.expect("failed to listen for event" ); |
| 46 | /// |
| 47 | /// println!("received ctrl-c event" ); |
| 48 | /// } |
| 49 | /// ``` |
| 50 | /// |
| 51 | /// Listen in the background: |
| 52 | /// |
| 53 | /// ```rust,no_run |
| 54 | /// tokio::spawn(async move { |
| 55 | /// tokio::signal::ctrl_c().await.unwrap(); |
| 56 | /// // Your handler here |
| 57 | /// }); |
| 58 | /// ``` |
| 59 | pub async fn ctrl_c() -> io::Result<()> { |
| 60 | os_impl::ctrl_c()?.recv().await; |
| 61 | Ok(()) |
| 62 | } |
| 63 | |