Инициализация sigset_t в Rust

Я пытаюсь узнать больше о FFI в Rust и связи с библиотеками C (особенноlibc). Во время моего «квеста» я столкнулся со следующей проблемой.

Нормальная картина в С
void(* sig_set(int sig, void(*handler)(int))) {
    // uninitialized sigaction structs
    struct sigaction new_action, old_action;

    // assign options to new action
    new_action.sa_flags = SA_RESTART;
    new_action.sa_handler = handler;
    sigemptyset(&new_action.sa_mask);

    if(sigaction(sig, &new_action, &old_action) < 0) {
        fprintf(stderr, "Error: %s!\n", "signal error");
        exit(1);
    }
    return old_action.sa_handler;
}
Попытка в Русте
fn sig_init(sig: i32, handler: fn(i32)->()) -> usize {
    unsafe {
        let mut new_action: libc::sigaction;
        let mut old_action: libc::sigaction;

        new_action.sa_flags = 0x10000000;
        new_action.sa_sigaction = handler as usize;
        libc::sigemptyset(&mut new_action.sa_mask as *mut libc::sigset_t);

        libc::sigaction(
            sig,
            &mut new_action as *mut libc::sigaction,
            &mut old_action as *mu,t libc::sigaction
            );
         old_action.sa_sigaction
    }
}

Когда я попробовал описанное выше, компилятор выдаст следующую ошибку для использования возможно неинициализированной переменной.

error: use of possibly uninitialized variable: `<variable here>` [E0381]

Это имеет смысл, так как очень плохие вещи могут произойти, еслиsigemptyset должны были читать изsa_mask, Поэтому я попробовал следующее в строке 3 выше.

let mut new_action: libc::sigaction = libc::sigaction{
    sa_sigaction: handler as usize,
    sa_flags: 0x10000000,
    sa_mask: mask,
};

Это не будет работать как_restorer отсутствует в приведенном выше примере, но_restorer это личное. Так как же обойти эту проблему или подобную ситуацию? Вы бы использовали что-то вродеmem::transmute?

Ответы на вопрос(2)

Ваш ответ на вопрос