George Russell <[EMAIL PROTECTED]> wrote,

> Is there a way in Glasgow Haskell to get a thread to wait on a child process
> in the same way as the Posix function wait(), and get the termination status
> of the child?  If so, how?

This is what I use when I want to avoid that wait()ing for a
process in one thread blocks the whole Haskell runtime:

    waitForExitCode pid = do
      status <- do
                  status <- getProcessStatus False False pid
                  -- Note: With WNOHANG, waitpid() can have a return value of
                  --       0 and still an `errno != 0'; the current
                  --       implementation of `getProcessStatus' doesn't handle
                  --       this case.
                  errno  <- getErrorCode
                  if errno == noChildProcess 
                    then do
                      return $ Just (Exited ExitSuccess)
                    else
                      return status
      case status of
        Nothing               -> do
                                   threadDelay 10000    -- wait 10ms
                                   waitForExitCode pid vec
        Just (Exited ec     ) -> return ec
        Just (Terminated sig) -> return $ ExitFailure (128 + sig)
        Just _                -> -- can't happen, as second argument = `False'
          error "Processes.proc: Stopped?"

Cheers,
Manuel

_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to