non-blocking io, EINTR

James Bailie jimmy at mammothcheese.ca
Wed Feb 27 13:51:52 UTC 2008


Mark Linn wrote:

 > I am setting the O_NONBLOCK flag on a socket file descriptor using fcntl,
 >
 > will a read() on the socket return EINTR when the process get a signal?

By default, read() will restart itself automatically, regardless
of whether the socket is blocking or not, as long as there is
data to be read in the socket receive buffer.  You can change
this behavior by calling sigaction().  For example, the code
below will make SIGTERM interrupt system calls.  They will return
an error code, usually -1, with the global errno set to EINTR.
If the socket is non-blocking and the socket receive buffer is
empty, then read() will also return an error, but with errno set
to EWOULDBLOCK.

#include <signal.h>

struct sigaction sigact;

sigact.sa_handler = sigterm_handler;
sigemptyset( &sigact.sa_mask );
sigact.sa_flags = 0;

if ( sigaction( SIGTERM, &sigact, NULL ) < 0 )
{
    perror( "sigaction()" );
    exit( 1 );
}

-- 
James Bailie <jimmy at mammothcheese.ca>
http://www.mammothcheese.ca


More information about the freebsd-hackers mailing list