{-# 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