carapace 0.2.0

A code runner for online judge
Documentation
use std::time::Duration;

use nix::sys::signal::{self, Signal};
use nix::unistd::Pid;
use tokio::task::{self, JoinHandle};
use tokio::time;
use tracing::trace;

pub fn async_kill(child_pid: Pid, timeout_ms: u64) -> JoinHandle<()> {
    task::spawn(async move {
        time::sleep(Duration::from_millis(timeout_ms)).await;
        let _ = send_signal(child_pid, Signal::SIGKILL);
    })
}

pub fn send_signal(pid: Pid, signal: Signal) -> nix::Result<()> {
    let result = signal::kill(pid, signal);
    trace!(
        "kill pid = {}, signal = {}, result = {:?}",
        pid,
        signal,
        result
    );
    result
}

pub fn killall(pids: &[Pid]) {
    for &pid in pids {
        let _ = send_signal(pid, Signal::SIGSTOP);
    }

    for &pid in pids {
        let _ = send_signal(pid, Signal::SIGKILL);
    }
}