Bryan O'Sullivan wrote:

Just because *your* end of each pipe is a line-buffered file handle has no bearing on the *other* process's management of its pair of endpoints. For example, on a Unix-like system, the other process's stdio will block-buffer stdin and stdout by default if it finds that they're not attached to tty-like file descriptors.

In case the implications of this aren't clear, let me expand a little.

You've got a line-buffered stdout. You write "1+1\n", which sends 4 bytes to the other process.

It's got a block-buffered stdin, so it's going to sit in its first read until it receives 512 bytes (or whatever the buffer size is) from you. And an oversized violin, you have a deadlock!

The converse bites you, too. You want to read a line from the other process. It writes "1+1\n" to you, but its stdio buffers up the 4 bytes because it hasn't reached the 512-byte watermark. It then tries to read from you, but you're still blocked trying to read the first line (that it hasn't actually sent) from it. Deadlock.

        <b
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to