#[cfg(unix)]
pub fn send_signal(pid: u32, signal: nix::sys::signal::Signal) -> Result<(), std::io::Error> {
use nix::errno::Errno;
use nix::sys::signal::kill;
use nix::unistd::Pid;
if pid == 0 {
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
"Invalid PID: 0",
));
}
let pid_i32 = match i32::try_from(pid) {
Ok(p) => p,
Err(_) => {
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
format!("PID {} is too large for this system", pid),
));
}
};
match kill(Pid::from_raw(pid_i32), signal) {
Ok(_) => Ok(()),
Err(e) => match e {
Errno::ESRCH => Err(std::io::Error::new(
std::io::ErrorKind::NotFound,
format!("Process with PID {} does not exist", pid),
)),
Errno::EPERM => Err(std::io::Error::new(
std::io::ErrorKind::PermissionDenied,
format!("Permission denied to send signal to PID {}", pid),
)),
_ => Err(std::io::Error::new(
std::io::ErrorKind::Other,
format!("Failed to send signal to PID {}: {}", pid, e),
)),
},
}
}