Я пытаюсь понять обработчик переполнения стека в 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.