[Haskell-cafe] Strange behavior of executeFile

Bryan O'Sullivan bos at serpentine.com
Sun Jul 29 13:34:10 EDT 2007


Krzysztof Kościuszkiewicz wrote:

> This works for files, but "randomly" fails when stdin is connected to
> a pipe (pstops complains that it can't seek input).

GHC's file handles are backed by non-blocking file descriptors.  The 
child process run by executeFile inherits the stdin, stdout and stderr 
file descriptors of your Haskell process, so they're unexpectedly (from 
its perspective) in non-blocking mode.

Due to POSIX sharing semantics, you can't simply switch those file 
descriptors to blocking in the child, because they'll then become 
blocking in the parent, too.

Anything involving sharing file descriptors between processes becomes 
similarly broken if the GHC runtime starts using a file descriptor as a 
Handle.  You're not the only one to be surprised by this behaviour, but 
unfortunately it's not trivial to work around.

Simon Marlow was going to look into this problem a few months ago, but I 
don't know if he's had a chance to.

	<b


More information about the Haskell-Cafe mailing list