On Fri, 24 Feb 2006, Marcin 'Qrczak' Kowalczyk wrote:
> Simon Marlow <[EMAIL PROTECTED]> writes:
>> I think the reason we set O_NONBLOCK is so that we don't have to test
>> with select() before reading, we can just call read().  If you don't
>> use O_NONBLOCK, you need two system calls to read/write instead of
>> one. This probably isn't a big deal, given that we're buffering anyway.
> 
> I've heard that for Linux sockets select/poll/epoll might say that
> data is available where it in fact is not (it may be triggered by
> socket activity which doesn't result in new data).

Only UDP, from anything I'm able to find out about this.
Apparently a UDP packet may turn out to be invalid in some respect,
to be discovered too late during the recvmsg system call.  In a
similar situation, the TCP layer would have already accounted for
this by the time select sees anything.  Likewise of course any
local slow devices like a tty, pipe etc.

> Select/poll/epoll
> are designed to work primarily with non-blocking I/O.

That's what the Linux kernel developers say, anyway, since it
would be inconvenient for them to fix this, even though it
apparently violates the POSIX specification.

        Donn Cave, [EMAIL PROTECTED]

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

Reply via email to