Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何捕捉锈迹中的信号_Rust - Fatal编程技术网

Rust 如何捕捉锈迹中的信号

Rust 如何捕捉锈迹中的信号,rust,Rust,我正试图写一些代码来捕捉像SIGTERM这样的信号 我找到了,我也找到了 但在当前的Rust版本(每晚0.12次)中,似乎删除了std::io::signal::Listener。它放在别的地方了吗?如果是这样,有人能告诉我如何捕捉信号吗?我相信std::io::signal模块在pull请求中被删除了。据称,本机运行时从未正确实现适当的信号处理,因此您现在可能无法使用它。似乎是此问题的跟踪问题 同时,我认为,在撰写此答案时,您必须从libc降至最低级别的不安全函数 我在以下方面取得了一些成功:

我正试图写一些代码来捕捉像SIGTERM这样的信号

我找到了,我也找到了


但在当前的Rust版本(每晚0.12次)中,似乎删除了
std::io::signal::Listener
。它放在别的地方了吗?如果是这样,有人能告诉我如何捕捉信号吗?

我相信
std::io::signal
模块在pull请求中被删除了。据称,本机运行时从未正确实现适当的信号处理,因此您现在可能无法使用它。似乎是此问题的跟踪问题


同时,我认为,在撰写此答案时,您必须从
libc

降至最低级别的不安全函数

我在以下方面取得了一些成功:

#[宏使用]
陈文杰;
外部板条箱信号;
使用chan_信号::信号;
fn main(){
//当操作系统发送INT或TERM信号时,Signal获取一个值。
let signal=chan_signal::notify(&[signal::INT,signal::TERM]);
//我们的工作完成后,在“sdone”上发送哨兵值。
let(sdone,rdone)=chan::sync(0);
//运行工作。
::std::thread::spawn(move | | run(sdone));
//等待信号或工作完成。
陈选{
signal.recv()->signal=>{
println!(“接收信号:{:?}”,信号)
},
rdone.recv()=>{
println!(“程序正常完成”);
}
}
}
fn运行(_sdone:chan::Sender){
println!(“运行工作5秒”);
println!(“你能足够快地发出信号吗?”);
//做一些工作。
:std::thread::sleep_ms(5000);
//_sdone被丢弃,关闭频道并导致'rdone`
//解除封锁。
}

现在实现这一点似乎相当简单。Rust中的命令行应用程序的定义超过了这个概念,并提到了处理特定信号的板条箱,以及处理一般信号的板条箱

通过导向器,带信号钩,其应尽可能简单:

use std::{error::Error, thread};
use signal_hook::{iterator::Signals, SIGTERM};

fn main() -> Result<(), Box<Error>> {
    let signals = Signals::new(&[SIGTERM])?;

    thread::spawn(move || {
        for sig in signals.forever() {
            println!("Received signal {:?}", sig);
        }
    });

    Ok(())
}
使用std:{error::error,thread};
使用signal_hook::{iterator::Signals,SIGTERM};
fn main()->结果{
让信号=信号::新(&[SIGTERM])?;
线程::生成(移动| |{
对于sig in signals.forever(){
println!(“接收信号{:?}”,sig);
}
});
好(())
}

这是一个很好的关于锈病信号的概述:
use std::{error::Error, thread};
use signal_hook::{iterator::Signals, SIGTERM};

fn main() -> Result<(), Box<Error>> {
    let signals = Signals::new(&[SIGTERM])?;

    thread::spawn(move || {
        for sig in signals.forever() {
            println!("Received signal {:?}", sig);
        }
    });

    Ok(())
}