Как обработать сигнал 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.

0 ответов

Другие вопросы по тегам