fflush() on readonly files
Tim Robbins
tim at robbins.dropbear.id.au
Thu Jun 10 02:53:13 GMT 2004
On Wed, Jun 09, 2004 at 07:13:56PM -0700, David Schultz wrote:
> On Wed, Jun 09, 2004, Radim Kolar wrote:
> > I have submitted pr http://www.freebsd.org/cgi/query-pr.cgi?pr=65402 with patch
> > which makes fflush() on read only descriptors do not return error code.
> >
> > Reasons for this patch:
> > 1 - Do not breaks ISO C standard
> > 2 - Makes FreeBSD undefined behavior compatible with other operation systems
> > 3 - Correct some programs depending on this
>
> Are there any such programs?
>
> > 4 - Makes fflush() and fsync() behavior identical - avoids programmer's confusion.
> > 5 - If there are no data to flush() then flush operation (dummy) succeeds, not failed.
> >
> > Against this patch:
> > Programs which rely upon fflush() not returning an error
> > when passed a file which is opened read-only are broken,
> > and should be fixed.
> >
> > Colin Percival
>
> I don't see how that's an argument against it. Programs that call
> fflush() on a read-only stream are broken either way.
>
> > Are there any other reasons for non commiting it? I think that in this case
> > pro > cons.
>
> Well, I think all those other operating systems (Solaris, HP-UX,
> Linux, etc.) are wrong in this case, but it would probably behoove
> us to conform to the /de facto/ standard.
This patch has already been discussed, and I thought it was pretty obvious
that it had been rejected.
The behaviour of fflush() on a read-only stream is not defined by any
relevant standards, and there is no consensus on what it should do.
It is a no-op on 7th edition UNIX (this may have just been to simplify
implementing the other functions; rewind() calls fflush() regardless of mode.)
It discards unread buffered data (like fpurge()) in the Microsoft C library.
I think other MS-DOS and Windows libraries behaved similarly to Microsoft's.
In my experience, fflush() is only called on input streams when the Microsoft
behaviour is expected. Some people are taught to write C like this:
int j;
scanf("%d", &j);
fflush(stdin);
/* ... more scanf() calls ... */
... which is wrong, and silently does something other than what the programmer
expected on many systems.
Bottom line: learn C, fix your code.
Tim
More information about the freebsd-arch
mailing list