我试图了解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上运行此程序。