2014-10-09 32 views
9

में सिग्नल कैसे पकड़ें मैं कुछ कोड लिखने की कोशिश कर रहा हूं जो सिग्टरएम जैसे सिग्नल को पकड़ लेगा।जंग

मुझे this मिला और मुझे How to handle blocking i/o in Rust, or long running external function calls in general भी मिला।

लेकिन वर्तमान जंग संस्करण (0.12 रात) में ऐसा लगता है कि std::io::signal::Listener हटा दिया गया था। क्या इसे कहीं और रखा गया? यदि ऐसा है तो कोई मुझे सिग्नल पकड़ने के लिए इंगित कर सकता है?

उत्तर

7

मेरा मानना ​​है कि मॉड्यूल this पुल अनुरोध में हटा दिया गया था। दावा किया जाता है कि देशी रनटाइम के लिए उचित सिग्नल हैंडलिंग को कभी भी लागू नहीं किया गया था, इसलिए आप अब भी इसका उपयोग करने में सक्षम नहीं होंगे। This इस समस्या के लिए एक ट्रैकिंग समस्या प्रतीत होता है।

इस बीच, मुझे लगता है कि आपको libc से निम्नतम स्तर के असुरक्षित कार्यों में गिरा देना होगा।

4

इस उत्तर को लिखने के समय, an RFC for built-in signals है।

#[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. 
} 
:

मैं कुछ का उपयोग कर सफलता the chan-signal crate पड़ा है