tcrm-task 0.4.2

Task execution unit for TCRM project
Documentation
use crate::tasks::process::group::builder::ProcessGroup;
use crate::tasks::process::group::error::ProcessGroupError;

impl ProcessGroup {
    /// Send a signal to all processes in the group (Unix).
    ///
    /// Sends the specified signal to the process group using killpg().
    ///
    /// # Arguments
    ///
    /// * `signal` - The signal to send to the process group
    ///
    /// # Returns
    ///
    /// * `Ok(())` - If the signal was sent successfully or processes were already terminated
    /// * `Err(ProcessGroupError)` - If sending the signal fails due to permissions or other errors
    ///
    /// # Example
    /// ```rust,no_run
    /// use tcrm_task::tasks::process::group::builder::ProcessGroup;
    /// use nix::sys::signal::Signal;
    /// let mut group = ProcessGroup::new();
    /// // ... spawn processes in the group ...
    /// group.send_signal(Signal::SIGUSR1).unwrap();
    /// ```
    #[cfg(unix)]
    pub fn send_signal(&self, signal: nix::sys::signal::Signal) -> Result<(), ProcessGroupError> {
        use nix::sys::signal::killpg;
        use nix::unistd::Pid;
        if let Some(pgid) = self.inner.process_group_id {
            use nix::errno::Errno;
            match killpg(Pid::from_raw(pgid), signal) {
                Ok(_) => Ok(()),
                Err(e) => match e {
                    Errno::ESRCH => Ok(()), // Process group no longer exists
                    Errno::EPERM => Err(ProcessGroupError::SignalFailed(format!(
                        "Permission denied to send signal {:?} to process group {}",
                        signal, pgid
                    ))),
                    _ => Err(ProcessGroupError::SignalFailed(format!(
                        "Failed to send signal {:?} to process group {}: {}",
                        signal, pgid, e
                    ))),
                },
            }
        } else {
            Err(ProcessGroupError::SignalFailed(
                "No process group ID available".to_string(),
            ))
        }
    }
}