Как обработать сигнал SIGSEGV в пользовательском пространстве, используя 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();
}
Я хочу поймать сигнал и выполнить мой обработчик сигнала. Если я регистрирую свой обработчик сигнала, я получаю сообщение "Ошибка сегментации (ядро сброшено)". Если я не регистрирую обработчик сигнала, я получаю сообщение о переполнении стека.
Этот обработчик сигнала работает нормально, если я зарегистрирую его для SIGINT
сигнал, но дает странные результаты для SIGSEGV
, Что мне не хватает?
Я запускаю эту программу на Ubuntu 18.04.