2014-10-09 17 views

risposta

7

Credo che il modulo std::io::signal sia stato rimosso nella richiesta di prelievo this. Si sostiene che la corretta gestione dei segnali non è mai stata implementata correttamente per il runtime nativo, quindi probabilmente non sarebbe in grado di utilizzarlo ora. This sembra essere un problema di rilevamento per questo problema.

Nel frattempo, penso che sarà necessario passare alle funzioni non sicure di livello più basso da libc.

4

Al momento della stesura di questa risposta, c'è an RFC for built-in signals.

ho avuto un certo successo con the chan-signal crate:

#[macro_use] 
extern crate chan; 
extern crate chan_signal; 

use chan_signal::Signal; 

fn main() { 
    // Signal gets a value when the OS sent a INT or TERM signal. 
    let signal = chan_signal::notify(&[Signal::INT, Signal::TERM]); 
    // When our work is complete, send a sentinel value on `sdone`. 
    let (sdone, rdone) = chan::sync(0); 
    // Run work. 
    ::std::thread::spawn(move || run(sdone)); 

    // Wait for a signal or for work to be done. 
    chan_select! { 
     signal.recv() -> signal => { 
      println!("received signal: {:?}", signal) 
     }, 
     rdone.recv() => { 
      println!("Program completed normally."); 
     } 
    } 
} 

fn run(_sdone: chan::Sender<()>) { 
    println!("Running work for 5 seconds."); 
    println!("Can you send a signal quickly enough?"); 
    // Do some work. 
    ::std::thread::sleep_ms(5000); 

    // _sdone gets dropped which closes the channel and causes `rdone` 
    // to unblock. 
}