[Haskell-cafe] reliable (bi)directional pipe to a process

Don Stewart dons at galois.com
Tue Nov 11 02:07:32 EST 2008


oleg:
> 
> I'd like to point out a reliable, proven and simple way of interacting
> with another process, via unidirectional or bidirectional pipes. The
> method supports Unix sockets, pipes, and TCP sockets.
> 
> I too have noticed insidious bugs in GHC run-time when communicating
> with another process via a pipe. I tried to use runInteractiveProcess;
> it worked -- up to file sizes of about 300Kb. Then GHC run-time seems
> to `loses synchronization' -- and corrupts IO buffers, receiving stuff
> that cannot have been possibly sent. This is because handle operations
> are asynchronous and the GHC scheduler seems to have race conditions.
> That behavior was totally unacceptable. I was writing a production
> code, and can't afford such errors.

Did you file a bug report!?  Can you follow up with information we can
use to chase this down.

> Therefore, I wrote a simple foreign function interface to the code
> sys_open that I have been using for about fifteen years. This code
> does work, in production, for very large file sizes and long-running
> processes, on many Unix and Unix-like systems. I was told once about a
> Cygwin port.
> 	
> 	http://okmij.org/ftp/syscall-interpose.html#Application
> 	http://okmij.org/ftp/packages/sys_open.c
> 	http://okmij.org/ftp/Haskell/MySysOpen.hs
> 
> Please see the test at the end of the file MySysOpen.hs. The test
> interacts with another process over a bi-directional pipe, repeatedly
> sending and receiving data. The amount of received data is large
> (about 510K).

To file a bug, go here,

    http://hackage.haskell.org/trac/ghc/newticket?type=bug

-- Don


More information about the Haskell-Cafe mailing list