
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?
There's a couple of ways. The obvious way is to get the thread to place its result in an MVar when it exits: there's a guarantee that a thread always either exits or raises an exception, so you can wrap the top-level computation in something that places the result/exception in an MVar. Alternatively, you can foreign import rts_evalIO() and do it that way. It ought to work, but I haven't tried it. This way lets you get at the Interrupted or Deadlocked return states too, which you can't do solely within Haskell. Hmm, now I think about it, the compiler won't let you foreign import rts_evalIO() with the type you want, namely a -> Ptr b -> IO CInt, and quite rightly so. You'll need a version of rts_evalIO() that takes StablePtrs instead. Cheers, Simon