2014-10-09 80 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. 
}