fwrite/fread and unbuffered IO

Etienne Fortin etienne.fortin@sensio.tv
Fri Sep 17 19:42:00 GMT 2004

I created a diff of modifications I made to fread.c of newlib 1.12.0. It
now works as I expect unbuffered read to work. If the FILE I/O is
unbuffered, then _read() is directly called with the suplied memory
pointer and the number of bytes asked for without any other processing.

By the way, newlib 1.12.0 is working perfectly with RTEMS 4.6.1. The
only problem is a warning about implicit declaration of _fstat in
ttyname_r.c of libcsupport. The old header works but not the new of
newlib 1.12.0. Maybe it's something you are already informed of...

I'm still not sure if this buffered read thing is the expected behavior
or not... Anyone please!!! ;)

Etienne Fortin

>   /* *************************************** 
>      AUTHOR: Etienne Fortin (2004-09-17)
>      Change to accomodate for the fact that
>      in unbuffered IO, there's no need to
>      transit data via any kind of buffer.
>      Because of that, we read into buf
>      directly for the number of bytes needed.
>      *************************************** */
>   if (fp->_flags & __SNBF)
>     {
>       return (*fp->_read) (fp->_cookie, (char *) p, total);
>     }
>   /* *************************************** */

-----Message d'origine-----
De : Joel Sherrill <joel@OARcorp.com> [mailto:joel.sherrill@OARcorp.com]

Envoyé : 17 septembre, 2004 12:26
À : Etienne Fortin
Cc : newlib@sources.redhat.com
Objet : Re: fwrite/fread and unbuffered IO

Is this a termios device by any chance?

Could you try this with read()/write() not their f--- counterparts? That
would narrow the issue down to either RTEMS or newlib.


Etienne Fortin wrote:
> Hi everyone,
> I'm playing with fread and fwrite and found some strange behaviors. 
> Well, behavior that I wasn't expecting.
> If I put my FILE in "unbuffered mode" with setvbuf() and I call 
> fwrite(), the memory pointer supplied to fwrite() is directly used as 
> the source of the bytes being written to the stream. This is exactly 
> what I expected since I'm unbuffered, ie no transit via some other 
> buffer.
> But with fread, things are quite different. Let's say I'm unbuffered 
> and I write something like this:
>     fread(data, 1, 50, fp);
> I expect fread() to takes the "data" ptr directly as the container of 
> the received bytes. But strangely, instead, fread() use the 1 bytes 
> buffer embedded in the FILE structure (_ubuf) as a transit buffer for 
> the received characters. This is absolutely not the behavior I 
> expected. If I tell the FILE stream to be unbuffered, I don't expect 
> my data to transit via some buffer, even if that buffer is as small as

> one byte. It's still a buffer. Also, this behavior is quite 
> inneficient since the driver function responsible for getting 
> characters from the stream is called the number of bytes needed, in 
> the example 50 times!!! Unbuffered IO doesn't mean a device can't read

> bytes in sequence...
> Am I missing something here or is this behavior strange?
> Etienne Fortin
> Sensio

Joel Sherrill, Ph.D.             Director of Research & Development
joel@OARcorp.com                 On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
    Support Available             (256) 722-9985

More information about the Newlib mailing list