Инициализация 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
?