
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. 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).