non-blocking io, EINTR
Mark Linn
mark.linn at gmail.com
Wed Feb 27 18:43:17 UTC 2008
On Wed, Feb 27, 2008 at 5:25 AM, James Bailie <jimmy at mammothcheese.ca> wrote:
> 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
>
Thanks, Ed and James,
Then why in the world the sample code in this acm paper would test
EINTR in read and write?
link is here.
http://delivery.acm.org/10.1145/1350000/1344155/9815.html?key1=1344155&key2=2950393021&coll=GUIDE&dl=&CFID=15151515&CFTOKEN=6184618
More information about the freebsd-hackers
mailing list