This is the mail archive of the
newlib@sources.redhat.com
mailing list for the newlib project.
Re: RE : fwrite/fread and unbuffered IO
- From: "Joel Sherrill <joel at OARcorp dot com>" <joel dot sherrill at OARcorp dot com>
- To: Etienne Fortin <etienne dot fortin at sensio dot tv>
- Cc: newlib at sources dot redhat dot com
- Date: Fri, 17 Sep 2004 14:41:48 -0500
- Subject: Re: RE : fwrite/fread and unbuffered IO
- Organization: OAR Corporation
- References: <000401c49ce4$b1938c50$fd00a8c0@sensiord>
- Reply-to: joel dot sherrill at OARcorp dot com
Etienne Fortin wrote:
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.
I don't know the proper behavior on this one. Jeff?
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...
Send me this patch to the list so it can be incorporated into
the newlib cvs. I also will grab this patch and use it with the
RTEMS RPMs.
If someone approves your other patch, we will use it with RTEMS
as well.
I'm still not sure if this buffered read thing is the expected behavior
or not... Anyone please!!! ;)
Have you checked the opengroup.org standard pages?
--joel
Etienne Fortin
Sensio
131a132,146
/* ***************************************
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.
--joel
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