Skip to main content

running_process/
unix.rs

1#[cfg(unix)]
2#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum UnixSignal {
4    Interrupt,
5    Terminate,
6    Kill,
7}
8
9#[cfg(unix)]
10pub fn unix_set_priority(pid: u32, nice: i32) -> Result<(), std::io::Error> {
11    let result = unsafe { libc::setpriority(libc::PRIO_PROCESS, pid, nice) };
12    if result == -1 {
13        return Err(std::io::Error::last_os_error());
14    }
15    Ok(())
16}
17
18#[cfg(unix)]
19pub fn unix_signal_process(pid: u32, signal: UnixSignal) -> Result<(), std::io::Error> {
20    let result = unsafe { libc::kill(pid as i32, unix_signal_raw(signal)) };
21    if result == -1 {
22        return Err(std::io::Error::last_os_error());
23    }
24    Ok(())
25}
26
27#[cfg(unix)]
28pub fn unix_signal_process_group(pid: i32, signal: UnixSignal) -> Result<(), std::io::Error> {
29    let result = unsafe { libc::killpg(pid, unix_signal_raw(signal)) };
30    if result == -1 {
31        return Err(std::io::Error::last_os_error());
32    }
33    Ok(())
34}
35
36#[cfg(unix)]
37pub(crate) fn unix_signal_raw(signal: UnixSignal) -> i32 {
38    match signal {
39        UnixSignal::Interrupt => libc::SIGINT,
40        UnixSignal::Terminate => libc::SIGTERM,
41        UnixSignal::Kill => libc::SIGKILL,
42    }
43}