select/
select.rs

1#[macro_use]
2extern crate chan;
3extern crate chan_signal;
4
5use std::thread;
6use std::time::Duration;
7
8use chan_signal::Signal;
9
10fn main() {
11    // Signal gets a value when the OS sent a INT or TERM signal.
12    let signal = chan_signal::notify(&[Signal::INT, Signal::TERM]);
13    // When our work is complete, send a sentinel value on `sdone`.
14    let (sdone, rdone) = chan::sync(0);
15    // Run work.
16    thread::spawn(move || run(sdone));
17
18    // Wait for a signal or for work to be done.
19    chan_select! {
20        signal.recv() -> signal => {
21            println!("received signal: {:?}", signal)
22        },
23        rdone.recv() => {
24            println!("Program completed normally.");
25        }
26    }
27}
28
29fn run(_sdone: chan::Sender<()>) {
30    println!("Running work for 5 seconds.");
31    println!("Can you send a signal quickly enough?");
32    // Do some work.
33    thread::sleep(Duration::from_secs(5));
34}