[Haskell-cafe] Getting PID of a child process

Gwern Branwen gwern0 at gmail.com
Fri Oct 19 00:38:28 CEST 2012


On Thu, Oct 18, 2012 at 5:03 PM, Jason Dusek <jason.dusek at gmail.com> wrote:
> For diagnostic purposes, I'd like to print the PID of the
> process attached to this handle -- how best to do that?

In Mueval when I wanted the PID (so I could later send sigkills), I did this:

          hdl <- runProcess "mueval-core" args Nothing Nothing Nothing
Nothing Nothing
          _ <- forkIO $ do
                     threadDelay (7 * 700000)
                     status <- getProcessExitCode hdl
                     case status of
                         Nothing -> do terminateProcess hdl
                                       _ <- withProcessHandle hdl (\x
-> case x of

OpenHandle pid -> signalProcess 9 pid >> return (undefined, undefined)

_ -> return (undefined,undefined))
                                       exitWith (ExitFailure 1)
                         Just a -> exitWith a
          stat <- waitForProcess hdl
          exitWith stat

The key is the poorly documented withProcessHandle ::
System.Process.Internals.ProcessHandle -> (ProcessHandle__ -> IO
(ProcessHandle__, a)) -> IO a

The implementation:

    data ProcessHandle__ = OpenHandle PHANDLE | ClosedHandle ExitCode
    type PHANDLE = CPid

Well, my code seems to work, anyway...

-- 
gwern
http://www.gwern.net



More information about the Haskell-Cafe mailing list