
Sorry for taking so long to reply. On Tue, 2005-04-19 at 11:36 +0100, Simon Marlow wrote:
module Main where import System.Cmd main = rawSystem "nvi" [] [ patch calling resetNonBlockingFD in runProcess ] If we did this, we would also need to re-enable non-blocking mode after
On 16 April 2005 20:41, Benedikt Schmidt wrote: the rawSystem completes. Also, this doesn't work well if runProcess is used and the Haskell program continues to run while the subprocess is executing, because the O_NONBLOCK flag is shared between parent and child.
I didn't think about the flags beeing shared between parent and child. I tried using setFdOption first, but didn't see that rawSystem sets stdin back to blocking mode when stdin is evaluated. This works for me now with ghc-6.4: main = do stdin `seq` return () bracket (setFdOption stdInput NonBlockingRead False) (\_ -> setFdOption stdInput NonBlockingRead True) (\_ -> rawSystem "nvi" [])
So I suggest doing this for System.Cmd.{system,rawSystem} only.
Would something like that be safe for system and rawSystem if all arguments where forced before the setFdOption? If there are several threads? Benedikt