Есть такой кусок кода:
extern crate chan;
extern crate chan_signal;
use chan_signal::Signal;
use std::thread;
use std::net::UdpSocket;
fn main() {
// Initialize system signals handler
let signal = chan_signal::notify(&[Signal::INT, Signal::TERM]);
// Create UDP socket
let socket = UdpSocket::bind(
("0.0.0.0", 10000)
).unwrap();
// Spawn handler thread
thread::spawn( move || {
let mut buf = [0; 1024];
loop {
// Waiting for incoming message
let (n, src) = socket.recv_from(&mut buf).unwrap();
println!("Received {} bytes from {}: {:?}", n, src, &buf[..n]);
}
});
// In main thread wait for system signal
let sig = signal.recv().unwrap();
// Close socket
drop(socket);
}
Он, ясно дело, не компилируется, так как сокет заимствован потоком обработчика, когда я пытаюсь его закрыть.
В сях я бы просто прихлопнул сокет и вышел, тут же все, видимо, не так просто.
Как закрыть сокет при получении SIGTERM, если в этот момент поток владеющий им заблокирован вызовом recv_from?