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

时间:2018-08-28 20:45:19

标签: linux rust stack-overflow

我试图了解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();
}

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

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

我正在Ubuntu 18.04上运行此程序。

0 个答案:

没有答案