Inicializando sigset_t en Rust
Estoy tratando de aprender más sobre el FFI en Rust y vincularme con las bibliotecas C (específicamentelibc
) Durante mi "búsqueda" me encontré con el siguiente problema.
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;
}
Intento de herrumbrefn 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
}
}
Cuando probé lo anterior, el compilador arrojará el siguiente error para el uso de una variable posiblemente no inicializada.
error: use of possibly uninitialized variable: `<variable here>` [E0381]
Esto tiene sentido ya que podrían pasar cosas muy malas sisigemptyset
debían leer desa_mask
. Así que probé lo siguiente en la línea 3 de lo anterior.
let mut new_action: libc::sigaction = libc::sigaction{
sa_sigaction: handler as usize,
sa_flags: 0x10000000,
sa_mask: mask,
};
Esto no funcionará como_restorer
falta en el ejemplo anterior, pero_restorer
es privado. Entonces, ¿cómo se solucionaría este problema o una situación similar? ¿Usarías algo comomem::transmute
?