수색…
비고
Rust는 OS 신호로 충만하고 적절하고 관용적이며 안전한 방법이 없지만 신호 처리 기능을 제공하는 상자가 있지만 매우 실험적 이며 안전하지 않으므로 사용시주의해야합니다.
그러나 rust-lang / rfcs 저장소에 녹에 대한 원시 신호 처리를 구현하는 것에 대한 토론이 있습니다.
chan-signal crate로 신호 처리하기
chan-signal crate는 채널을 사용하여 OS 신호를 처리 할 수있는 솔루션을 제공합니다.이 상자는 실험적 이며 신중하게 사용해야합니다.
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로 신호 처리.
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);
}
Tokio 예제
토키오 신호 상자는 신호 처리를위한 토 키오 기반 솔루션을 제공합니다. 그래도 아직 초기 단계입니다.
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