如何使用 Rust 在用户空间处理 SIGSEGV 信号?

A-B*_*A-B 5 linux stack-overflow rust

我试图了解 Rust 中的堆栈溢出处理程序。recursive_stack()我编写了一次又一次声明一些局部变量的函数以耗尽堆栈空间。

extern crate nix;

use nix::sys::signal;

extern "C" fn handle_sigsegv(_: i32) {
    //Do something here
}

fn main() {
    let sig_action = signal::SigAction::new(
        signal::SigHandler::Handler(handle_sigsegv),
        signal::SaFlags::SA_NODEFER,
        signal::SigSet::empty(),
    );
    unsafe {
        signal::sigaction(signal::SIGSEGV, &sig_action);
    }
    println!("Before function");
    recursive_stack();
    println!("After function");
}

fn recursive_stack() {
    let _array: [i64; 50] = [0; 50];
    recursive_stack();
}
Run Code Online (Sandbox Code Playgroud)

我想捕获信号并执行我的信号处理程序。如果我注册信号处理程序,我会收到“分段错误(核心已转储)”消息。如果我不注册信号处理程序,则会收到堆栈溢出消息。

如果我将其注册为信号,则该信号处理程序工作正常SIGINT,但会给出奇怪的结果SIGSEGV。我缺少什么?

我在 Ubuntu 18.04 上运行这个程序。