Requesting help on intricacies of duplicated file descriptors.
Rich Felker
dalias at aerifal.cx
Mon Jul 24 00:16:02 PDT 2006
On Sun, Jul 23, 2006 at 04:06:00PM -0700, Carl Miller wrote:
> On Sun, Jul 23, 2006 at 06:50:39PM +0000, Garrett Kajmowicz wrote:
> > On Sunday 23 July 2006 03:35, Rich Felker wrote:
> >
> > <snip>
> >
> > > Also it's a bad idea to use non-blocking io with stdio streams (FILE
> > > *) unless you really know what you're doing. If no input is available,
> > > the read operation will return with error and set the error flag for
> > > the stream. It can be cleared with fclearerr() and presumably you can
> > > continue reading then, but nonblocking io is really the most useful in
> > > connection with the non-buffering unix-style fd io functions.
> >
> > Thanks for the primer. The case I need to address is reading a minimum of one
> > character from a stream (blocking until the character is available or
> > returning error if we are EOF). At the same time, I want to read as many
> > characters as possible (up to a limit) to go into some buffering code. Yes,
> > stdio does buffering, however I need to do my own limited buffering for
> > uClibc++. The current implementation switches between blocking and
> > non-blocking when doing reads, but I take it that this isn't a good idea.
> >
> > Instead, what is my best approach to read a minimum of 1 byte from the stream,
> > blocking only if needed to get that first byte?
>
> I'd skip stdio entirely, since you're doing your own buffering. Nothing
> worse than competing buffers. Set the file descriptor non-blocking, and
> before you read, do a poll() or select() on it, with infinite timeout.
> You'll block until there's either at least one character to read, or the
> fd has hit EOF.
read does this naturally without poll/select/nonblocking..
Rich
More information about the uClibc
mailing list