[Haskell] Spawning a process using Hugs/Win32

Graham Klyne gk at ninebynine.org
Tue Feb 3 16:11:22 EST 2004

I thought I might have a version of POpen that works with Win32/Hugs, but 
I'm only slightly successful.  The function of POpen is to spawn a 
sub-process using the Win32 equivalent of pipes to supply standard input 
and to accept standard output and standard error from the spawned process.

My starting point was a module called Win32Spawn, which I found in 
hslibs/win32 in the GHC source distribution.  I have managed to compile the 
accompanying module and FFI interface into a DLL.  The files used to do 
this are at [1], with the build process outlined in [2].

The key code in the new module POPen.hs [3] is in function "spawn", which 
was adapted from the original module "hslibs/win32/Win32Spawn.hs".  I had 
to change the code for "spawn", because the Hugs interface for function 
openFd is has fewer parameters than that provided by GHC.  The remaining 
parameters seem to be the same as for the GHC version of openFd.

The resulting program has compiled successfully, and the spawned program is 
activated as requested (in this case, curl:  my evidence is that my 
personal firewall is asking me if curl should be allowed to access the 

But I also get an I/O exception in the calling program, in function spawn, 
when trying to open a handle to write the spawned process' standard input 
stream.  My evidence for this is by this modification to the code:
         hIn <- catch (openFd (fromIntegral wIn) False WriteMode False)
               (\er -> do { putStrLn ("openFd wIn: "++show er)
                          ; ioError er
generating this message:
openFd wIn: openFd: does not exist (file does not exist)

My question is this:  are there any fundamental differences between GHC and 
Hugs, either in the implementation of openFd, or in the FFI interface, that 
would cause (what I assume is) a divergence of behaviour?  Does anyone have 
any other clues what might be going wrong here?

(BTW, I did get the HXml Toolbox to read and parse XML *from the web* using 
the internal HTTP library.)


[1] http://www.ninebynine.org/Software/HaskellUtils/Win32/

[2] http://www.ninebynine.org/Software/HaskellUtils/Win32/MakePOpenDLL.bat

[3] http://www.ninebynine.org/Software/HaskellUtils/Win32/POpen.hs

[4] http://www.ninebynine.org/Software/HaskellUtils/Win32/Win32Spawn.hs

Graham Klyne
For email:

More information about the Haskell mailing list