use rustix::process::{self, Pid, Signal};
pub(crate) fn send_terminate_signal(pid: u32) {
if let Ok(raw_pid) = i32::try_from(pid)
&& let Some(pid) = Pid::from_raw(raw_pid)
{
let _ = process::kill_process(pid, Signal::TERM);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_send_terminate_signal_kills_owned_child() {
let mut child = std::process::Command::new("sleep")
.arg("60")
.spawn()
.expect("failed to spawn sleep");
let child_pid = child.id();
send_terminate_signal(child_pid);
let exit_status = child.wait().expect("failed to wait on child");
assert!(
!exit_status.success(),
"child should have been killed, not exited normally"
);
}
#[test]
fn test_send_terminate_signal_ignores_overflow_pid() {
let overflow_pid = u32::MAX;
send_terminate_signal(overflow_pid);
}
}