sensu-run-0.2.0: System/Process/Kill.hs
{-# LANGUAGE CPP #-}
module System.Process.Kill (killProcessTree) where
import System.Process
#if !defined(WINDOWS)
import System.Process.Internals
import qualified System.Posix.Signals as Sig
import qualified System.Posix.Process as Proc
#endif
-- | Kill all processes in the same process group as the specified process.
killProcessTree :: ProcessHandle -> IO ()
killProcessTree ph =
#if defined(WINDOWS)
-- terminateProcess should kill the process and its children.
terminateProcess ph
#else
withProcessHandle ph $ \ph_ -> case ph_ of
OpenHandle pid -> sendKillSignal pid
ClosedHandle {} -> return ()
#if MIN_VERSION_process(1, 5, 0)
OpenExtHandle pid _ _ -> sendKillSignal pid
#endif
where
sendKillSignal pid = do
pgid <- Proc.getProcessGroupIDOf pid
Sig.signalProcessGroup Sig.killProcess pgid
#endif