
I managed to get runInteractiveProcess to work after all. Here is the code:
import System.Posix.Signals import System.IO hiding ( catch, try ) import System.Exit ( ExitCode(..) ) import System.Process import Control.Concurrent import Child -- http://cryp.to/child/Child.hs
test :: IO () test = do installHandler sigCHLD (Catch (return ())) Nothing (_,_,_, pid) <- runInteractiveProcess "/usr/bin/sleep" ["1"] Nothing Nothing sleep 5 safeGetExitCode pid >>= print
safeGetExitCode :: ProcessHandle -> IO ExitCode safeGetExitCode pid = timeout (10*1000000) (getRCLoop) >>= maybe (fail "timeout while waiting for external process") return where getRCLoop = getProcessExitCode pid >>= maybe (sleep 1 >> getRCLoop) return
The culprit seems to be: If you don't accept sigCHLD, you lose. If you use waitForProcess, you lose. Threaded RTS or not doesn't seem to make a difference. Peter