खोज…


टिप्पणियों

Rust के पास OS संकेतों के साथ लिडिएट करने का एक उचित और मुहावरेदार और सुरक्षित तरीका नहीं है लेकिन कुछ टोकरे हैं जो सिग्नल से निपटने की सुविधा प्रदान करते हैं लेकिन वे अत्यधिक प्रयोगात्मक और असुरक्षित हैं इसलिए उनका उपयोग करते समय सावधान रहें।

हालांकि जंग के लिए देशी सिग्नल हैंडलिंग को लागू करने के बारे में जंग-लंग / rfcs रिपॉजिटरी में चर्चा है।

RFCs चर्चा: https://github.com/rust-lang/rfcs/issues/1368

चान-सिग्नल टोकरा के साथ सिग्नल हैंडलिंग

चैन-सिग्नल टोकरा चैनलों का उपयोग करके ओएस सिग्नल को संभालने के लिए एक समाधान प्रदान करता है, पूरी तरह से यह टोकरा प्रयोगात्मक है और सावधानी से उपयोग किया जाना चाहिए।

उदाहरण BurntSushi / chan-signal से लिया गया है।

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

निक्स टोकरा के साथ संकेतों को संभालना।

Nix crate संकेतों को संभालने के लिए एक UNIX Rust API प्रदान करता है, हालांकि इसके लिए असुरक्षित जंग का उपयोग करने की आवश्यकता होती है, इसलिए आपको सावधान रहना चाहिए।

use nix::sys::signal;

extern fn handle_sigint(_:i32) {
    // Be careful here...
}

fn main() {
    let sig_action = signal::SigAction::new(handle_sigint,
                                          signal::SockFlag::empty(),
                                          signal::SigSet::empty());
    signal::sigaction(signal::SIGINT, &sig_action);
}

टोकियो उदाहरण

टोकियो-सिग्नल टोकरा संकेतों से निपटने के लिए एक टोको-आधारित समाधान प्रदान करता है। हालांकि यह अभी भी शुरुआती दौर में है।

extern crate futures;
extern crate tokio_core;
extern crate tokio_signal;

use futures::{Future, Stream};
use tokio_core::reactor::Core
use tokio_signal::unix::{self as unix_signal, Signal};
use std::thread::{self, sleep};
use std::time::Duration;
use std::sync::mpsc::{channel, Receiver};

fn run(signals: Receiver<i32>) {
    loop {
        if let Some(signal) = signals.try_recv() {
            eprintln!("received {} signal");
        }
        sleep(Duration::from_millis(1));
    }
}

fn main() {
    // Create channels for sending and receiving signals
    let (signals_tx, signals_rx) = channel();

    // Execute the program with the receiving end of the channel
    // for listening to any signals that are sent to it.
    thread::spawn(move || run(signals_rx));

    // Create a stream that will select over SIGINT, SIGTERM, and SIGHUP signals.
    let signals = Signal::new(unix_signal::SIGINT, &handle).flatten_stream()
        .select(Signal::new(unix_signal::SIGTERM, &handle).flatten_stream())
        .select(Signal::new(unix_signal::SIGHUP, &handle).flatten_stream());

    // Execute the event loop that will listen for and transmit received
    // signals to the shell.
    core.run(signals.for_each(|signal| {
        let _ = signals_tx.send(signal);
        Ok(())
    })).unwrap();
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow