Win32 process spawning, POpen and Hugs, revisited

Glynn Clements glynn.clements at virgin.net
Thu Mar 18 04:51:53 EST 2004


Graham Klyne wrote:

> Is "forkProcess" in the sense of a Unix fork?

Yes; but Simon's code only uses that to provide the Unix
implementation of runProcess and runInteractiveProcess. Those
functions are essentially combined fork+exec operations, so it should
be possible to implement them using Windows' CreateProcess().

For anyone who can't read the Process.hs attachment in Simon's message
(it is base64 encoded), the documentation and types of those functions
are:

-- runProcess

{- | Runs a raw command, optionally specifying 'Handle's from which to
     take the @stdin@, @stdout@ and @stderr@ channels for the new
     process.

     These 'Handle's may be created by 'createPipe', in order to set
     up communication channels with the remote process (but see also
     'runInteractiveProcess' if you want to do this).
-}
runProcess
  :: FilePath			-- ^ Filename of the executable
  -> [String]			-- ^ Arguments to pass to the executable
  -> Maybe [(String,String)]	-- ^ Optional environment (otherwise inherit)
  -> Maybe Handle		-- ^ Handle to use for @stdin@
  -> Maybe Handle		-- ^ Handle to use for @stdout@
  -> Maybe Handle		-- ^ Handle to use for @stderr@
  -> IO ProcessHandle

-- runInteractiveProcess

{- | Runs a raw command, and returns 'Handle's that may be used to communicate
     with the process via its @stdin@, @stdout@ and @stderr@ respectively.

     'runInteractiveProcess' may not be implementable in terms of 
     'runProcess' and 'createPipe', because of the need to ensure
     that the ends of the pipes that the child process does not use
     are closed correctly (otherwise the child process will not be
     able to receive EOF on stdin when the parent process closes 
     the stdin 'Handle', for example).
-}
runInteractiveProcess
  :: FilePath			-- ^ Filename of the executable
  -> [String]			-- ^ Arguments to pass to the executable
  -> Maybe [(String,String)]	-- ^ Optional environment (otherwise inherit)
  -> IO (Handle,Handle,Handle,ProcessHandle)

-- 
Glynn Clements <glynn.clements at virgin.net>


More information about the Libraries mailing list