tech-net archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: A possible bug with non-blocking sockets and SIGIO
On Sun, Mar 06, 2011 at 10:15:52PM +0000, Matthias Scheler wrote:
> On Thu, Feb 17, 2011 at 10:58:10AM +0300, Dmitry Matveev wrote:
> > I have discovered a bug (at least it looks like a bug) in NetBSD's
> > socket layer.
>
> I disagree, see below.
>
> > Background information
> > ----------------------
> >
> > Suppose there is a single-threaded server. It uses SIGIO to maintain
> > incoming connections and data from clients.
>
> Using SIGIO is bad idea in general. Please use poll(2) or
> kqueue(2) + kevent(2) instead.
>
> > Server process does not receive SIGIO on incoming data on the client
> > socket.
>
> Because you never setup the acceptor socket to do so.
>
> Here are my comment about your source code:
>
> void incoming_data (int i) {
> if (i != SIGIO)
> exit (0);
>
> It is not safe to use exit(3) from a signal handler, please use
> _exit(2) instead.
>
> g_client = accept_client (g_server);
> CLOG ("client accepted");
>
> Here is your problem. You newer setup asynchronous I/O on this socket.
> You need to use fcntl(2) to set O_ASYNC just as you do on the
> acceptor socket.
I've looked at your source again and you do call fcntl(2) on the
client socket. The problem is probably a race condition. Data
has arrived before your process goes calls wait(). The conclusion
is not to use SIGIO.
Kind regards
--
Matthias Scheler http://zhadum.org.uk/
Home |
Main Index |
Thread Index |
Old Index