tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: checking for a closed socket
> I've been debugging an issue wuth Xen, where xenstored loops at 100%
> CPU on poll(2).
> after code analysis it's looping on closed Unix socket desriptors.
> From what I understood the code expect poll(2) to return something
> different from POLLIN when the remote end of the socket is closed (it
> checks for (~(POLLOUT|POLLIN)) to it could be either POLLERR or
> POLLHUP I guess - or eventually POLLRDHUP which we don't have).
> Who is right here, linux or NetBSD (linux claims to be posix, while
> our man page doens't mention it) ?
The poll(2) manpage in 9.1, 5.2, and 1.4T has a section
COMPATIBILITY
This implementation differs from the historical one in that a given file
descriptor may not cause poll() to return with an error. In cases where
this would have happened in the historical implementation (e.g. trying to
poll a revoke(2)ed descriptor), this implementation instead copies the
events bitmask to the revents bitmask. Attempting to perform I/O on this
descriptor will then return an error. This behaviour is believed to be
more useful.
which looks likely relevant. (The above quote is copypasted from the
1.4T manpage; the 5.2 and 9.1 versions look identical to a quick
eyeball skim, but I haven't mechanically compared them.)
> Is there a way to check if a connection has been closed without a
> read() ?
ioctl(FIONREAD), perhaps? But I suspect you mean "without an
additional syscall", in which case I suspect there is not.
I think the theory is: why does it matter? If you're not going to try
to do I/O on it, then why do you care? And if you are, then can't the
check for the peer having closed be implicit in the I/O attempt?
Is there some reason it's difficult to do it that way?
/~\ The ASCII Mouse
\ / Ribbon Campaign
X Against HTML mouse%rodents-montreal.org@localhost
/ \ Email! 7D C8 61 52 5D E7 2D 39 4E F1 31 3E E8 B3 27 4B
Home |
Main Index |
Thread Index |
Old Index