diff options
Diffstat (limited to 'init/src/signals/sigchld.rs')
| -rw-r--r-- | init/src/signals/sigchld.rs | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/init/src/signals/sigchld.rs b/init/src/signals/sigchld.rs index 78b72d4..185e56e 100644 --- a/init/src/signals/sigchld.rs +++ b/init/src/signals/sigchld.rs @@ -1,10 +1,17 @@ -use libc::{signal, sighandler_t, SIGCHILD, SIG_DFL, SIG_IGN}; +use libc::{pid_t, + SIGCHLD, + waitpid, + WNOHANG, + sigaction, + sigemptyset, + SA_RESTART}; + use std::ffi::c_int; fn sigchild_handler(_signal: c_int) { loop { let mut status: c_int = 0; - ket pid: pid_t = unsafe { + let pid: pid_t = unsafe { waitpid(-1 , &mut status, WNOHANG) }; @@ -15,4 +22,17 @@ fn sigchild_handler(_signal: c_int) { } +pub fn sigchild_handler() -> Result<(), Box<dyn std::error::Error>> { + unsafe { + let mut sigact: sigaction = std::mem::zeroed(); + sigact.sa_sigaction = sigchild_handler as usize; + sigemptyset(&mut sigact.sa_mask); + sigact.sa_flags = SA_RESTART; + if sigaction(SIGCHLD, &sigact, std::ptr::null_mut()) == -1 { + Err("Sigaction check returned -1".into()) + } else { + Ok(()) + } + } +} |
