2014-10-09 86 views

回答

7

我相信std::io::signal模块在this拉取请求中被删除。据称正确的信号处理从未在本机运行时正确实施,因此您现在无论如何都无法使用它。 This似乎是这个问题的跟踪问题。

与此同时,我认为,您必须从libc降到最底层的不安全功能。

4

在写这个答案时,有an RFC for built-in signals

我不得不使用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. 
}