Re: UDP recvmsg blocks after select(), 2.6 bug?

Martijn Sipkema
2004-10-17T19:43:07Z

From: "Buddy Lucas" <buddy.lucas@gmail.com>
> On Sun, 17 Oct 2004 20:58:39 +0100, Martijn Sipkema <martijn@entmoot.nl> wrote:
> > >
> > > But then I am one of those who thinks it's sane to check for
> > > EWOULDBLOCK on a nonblocking socket after blocking in select().
> >
> > A POSIX comliant implementation would never do this.
>
> Here's your own quote, from a couple of hundred mails ago:
>
> > According to POSIX:
>
> > A descriptor shall be considered ready for reading when a call to an
> > input function with O_NONBLOCK clear would not block, whether or not
> > the function would transfer data successfully.
>
> You concluded from this that, if select() says a descriptor is
> readable, the subsequent recvmsg() must not block. The point is, from
> your quote I cannot deduct anything but: a recvmsg() on a descriptor
> that is readable must not block -- which makes perfect sense.
>
> But unless POSIX also says something about the conservability of
> "readability" of descriptors, specifically in between select() and
> recvmsg(), your conclusion is just wrong.

But with the current Linux implementation it is possible that a call to select()
returns while a call to recvmsg() would have blocked, and that is not
correct according to POSIX.

And I indeed read this as meaning that the first recvmsg() after the select()
may not block.

> > > Let's just document this and move on to something more important.
> >
> > It actually _is_ important. Just implement select() and recvmsg() as
> > described in the standard.
>
> I am very glad Linux makes sane decisions while trying to adhere to
> the standards as much as possible.

I don't think this is ``trying to adhere to the standards''... not by a long shot.

--ms