read with timeout ??
Carlos A. M. dos Santos
unixmania at gmail.com
Fri Aug 8 15:00:31 UTC 2008
On Fri, Aug 8, 2008 at 5:09 AM, Pieter de Goeje <pieter at degoeje.nl> wrote:
> On Friday 08 August 2008, Carlos A. M. dos Santos wrote:
>> On Thu, Aug 7, 2008 at 10:14 PM, Nate Eldredge <neldredge at math.ucsd.edu>
>> > On Thu, 7 Aug 2008, Chuck Robey wrote:
>> >> -----BEGIN PGP SIGNED MESSAGE-----
>> >> Hash: SHA1
>> >> I have my head lost in a code problem. I just hit a point where I need
>> >> to do a
>> >> read from an fd, but I need to associate it with a timeout, on the order
>> >> of 1
>> >> second, something like that. I had the feeling that there's a function
>> >> in FreeBSD's libc that makes that simple, but I forget the function
>> >> name. If anyone can remember something like what I'm talking about, I
>> >> sure would appreciate a function name. I can figure out how it works,
>> >> if I could only
>> >> dredge up that name.
>> > man 2 select
>> If the fd is a socket then you can also use setsockopt(2) to set
>> SO_RCVTIMEO and check for EWOULDBLOCK (same as EAGAIN) upon read(2) or
>> recv(2) errors. The net effect is the same of using select but the
>> syntax is simpler, IMO.
> I think poll(2) is also simpler than select for this purpose.
BTW, the setsockopt(2) manual page stands that a send or receive
timeout returns with the error EWOULDBLOCK but read(2) recv(2) send(2)
and write(2) only list EAGAIN in their ERRORS section. This is
harmless on BSD and Linux because EAGAIN and EWOULDBLOCK are the same,
but may sound confusing for people porting from/to System V. On HP-UX,
for instance, recv(2) lists both EAGAIN and EWOULDBLOCK.
The setsockopt man page should be improved in order to explain
standards conformance and porting issues. I volunteer to do it but the
changes must be reviewed by a native English speaker.
If you think things can't get worse it's probably only
because you lack sufficient imagination.
More information about the freebsd-standards