Есть такой кусок кода:
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?



