Q66052: INFO: fflush() & flushall() Do Not Write Data Directly to Disk
Article: Q66052
Product(s): Microsoft C Compiler
Version(s): MS-DOS:6.0,6.00a,6.00ax,7.0; WINDOWS:1.0,1.00a; WINDOWS NT:1.0,2.0,2.1,4.0,5.0
Operating System(s):
Keyword(s): kbCRT kbVC100 kbVC150 kbVC200 kbVC210 kbVC400 kbVC500 kbVC600
Last Modified: 22-JUL-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- The C Run-Time (CRT), included with:
- Microsoft C for MS-DOS, versions 6.0, 6.0a, 6.0ax
- Microsoft C/C++ for MS-DOS, version 7.0
- Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5
- Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 4.0, 5.0, 6.0
-------------------------------------------------------------------------------
SUMMARY
=======
The fflush() and flushall() functions in the C run-time library do not write
file changes directly to disk. These functions flush the file buffers provided
by the library; they do not flush the buffers the MS-DOS, OS/2, or Windows NT
operating systems provide at the system level. For example, if an application
calls fflush() but MS-DOS does not write its buffers to disk before a system
crash (or equivalent event), information may still be lost.
MORE INFORMATION
================
To address this situation in MS-DOS, use the _commit() function after you call
fflush() or fflushall(). Calling _commit() causes the operating system to flush
to disk the buffer associated with a file handle.
The OS/2 operating system provides two separate functions, depending on the
installed version of OS/2. In 16-bit OS/2 (versions 1.x), use the DosBufReset()
function. In 32-bit OS/2 (version 2.0), use the DosResetBuffer() function.
The Windows NT operating system provides the WIN32 API FlushFileBuffers(). The
_commit() function included with the Visual C++ 32-bit Edition CRT calls
FlushFileBuffers to write buffered data to disk.
Microsoft C/C++ version 7.0 introduces the "c" mode option for the fopen()
function. When an application opens a file and specifies the "c" mode, the
run-time library writes the contents of the file buffer to disk when the
application calls the fflush() or _flushall() function. The "c" mode option is a
Microsoft extension and is not part of the ANSI standard for fopen().
To change the default behavior of the fflush() and _flushall() functions, link
your application with the COMMODE.OBJ file provided by the products listed at
the beginning of this article. COMMODE.OBJ changes the global commit flag such
that calling fflush() or _flushall() commits the file buffer to disk. This flag
tells fflush() to call _commit() to flush the low- level file when the stream is
flushed and _commit() in turn calls _dos_commit() for the MS-DOS level file. By
default flushing a stream does not flush the low-level and MS-DOS level files.
Additional query words:
======================================================================
Keywords : kbCRT kbVC100 kbVC150 kbVC200 kbVC210 kbVC400 kbVC500 kbVC600
Technology : kbVCsearch kbAudDeveloper kbCRT
Version : MS-DOS:6.0,6.00a,6.00ax,7.0; WINDOWS:1.0,1.00a; WINDOWS NT:1.0,2.0,2.1,4.0,5.0
Issue type : kbinfo
=============================================================================
THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.
Copyright Microsoft Corporation 1986-2002.