STDIO(3C) Standard C Library Functions STDIO(3C)
NAME
stdio, stdin, stdout, stderr - standard buffered input/output package
SYNOPSIS
#include <stdio.h>
extern FILE *stdin; extern FILE *stdout; extern FILE *stderr;DESCRIPTION
The standard I/O functions described in section 3C of this manual
constitute an efficient, user-level
I/O buffering scheme. The in-line
macros
getc() and
putc() handle characters quickly. The macros
getchar(3C) and
putchar(3C), and the higher-level routines
fgetc(3C),
fgets(3C),
fprintf(3C),
fputc(3C),
fputs(3C),
fread(3C),
fscanf(3C),
fwrite(3C),
gets(3C),
getw(3C),
printf(3C),
puts(3C),
putw(3C), and
scanf(3C) all use or act as if they use
getc() and
putc(); they can be
freely intermixed.
A file with associated buffering is called a
stream (see
Intro(3)) and is
declared to be a pointer to a defined type
FILE. The
fopen(3C) function
creates certain descriptive data for a stream and returns a pointer to
designate the stream in all further transactions. Streams to memory may
also be created through the
fmemopen(3C),
open_memstream(3C), and
open_wmemstream(3C) functions. Normally, there are three open streams
with constant pointers declared in the
<stdio.h> header and associated
with the standard open files:
stdin standard input file
stdout standard output file
stderr standard error file
The following symbolic values in <
unistd.h> define the file descriptors
that will be associated with the C-language
stdin,
stdout and
stderr when
the application is started:
STDIN_FILENO Standard input value 0
stdin STDOUT_FILENO Standard output value 1
stdout STDERR_FILENO Standard error value 2
stderr The constant
NULL designates a null pointer.
The integer-constant
EOF is returned upon end-of-file or error by most
integer functions that deal with streams (see the individual descriptions
for details).
The integer constant
BUFSIZ specifies the size of the buffers used by the
particular implementation.
The integer constant
FILENAME_MAX specifies the number of bytes needed to
hold the longest pathname of a file allowed by the implementation. If
the system does not impose a maximum limit, this value is the recommended
size for a buffer intended to hold a file's pathname.
The integer constant
FOPEN_MAX specifies the minimum number of files that
the implementation guarantees can be open simultaneously. Note that no
more than 255 files may be opened using
fopen(), and only file
descriptors 0 through 255 can be used in a stream. This restriction only
holds for the 32-bit compilation environment. The 64-bit environment may
use more streams and the use of more than 255 may be enabled in a 32-bit
environment through the use of
extendedFILE(7).
The functions and constants mentioned in the entries of section 3S of
this manual are declared in that header and need no further declaration.
The constants and the following "functions" are implemented as macros
(redeclaration of these names is perilous):
getc(),
getchar(),
putc(),
putchar(),
ferror(3C),
feof(3C),
clearerr(3C), and
fileno(3C). There are
also function versions of
getc(),
getchar(),
putc(),
putchar(),
ferror(),
feof(),
clearerr(), and
fileno().
Output streams, with the exception of the standard error stream
stderr,
are by default buffered if the output refers to a file and line-buffered
if the output refers to a terminal. The standard error output stream
stderr is by default unbuffered, but use of
freopen() (see
fopen(3C))
will cause it to become buffered or line-buffered. When an output stream
is unbuffered, information is queued for writing on the destination file
or terminal as soon as written; when it is buffered, many characters are
saved up and written as a block. When it is line-buffered, each line of
output is queued for writing on the destination terminal as soon as the
line is completed (that is, as soon as a new-line character is written or
terminal input is requested). The
setbuf() or
setvbuf() functions (both
described on the
setbuf(3C) manual page) may be used to change the
stream's buffering strategy.
Interactions of Other FILE-Type C Functions A single open file description can be accessed both through streams and
through file descriptors. Either a file descriptor or a stream will be
called a
handle on the open file description to which it refers; an open
file description may have several handles.
Handles can be created or destroyed by user action without affecting the
underlying open file description. Some of the ways to create them
include
fcntl(2),
dup(2),
fdopen(3C),
fileno(3C) and
fork(2) (which
duplicates existing ones into new processes). They can be destroyed by at
least
fclose(3C) and
close(2), and by the
exec functions (see
exec(2)),
which close some file descriptors and destroy streams.
A file descriptor that is never used in an operation and could affect the
file offset (for example
read(2),
write(2), or
lseek(2)) is not
considered a handle in this discussion, but could give rise to one (as a
consequence of
fdopen(),
dup(), or
fork(), for example). This exception
does include the file descriptor underlying a stream, whether created
with
fopen() or
fdopen(), as long as it is not used directly by the
application to affect the file offset. (The
read() and
write() functions
implicitly affect the file offset;
lseek() explicitly affects it.)
If two or more handles are used, and any one of them is a stream, their
actions shall be coordinated as described below. If this is not done,
the result is undefined.
A handle that is a stream is considered to be closed when either an
fclose() or
freopen(3C) is executed on it (the result of
freopen() is a
new stream for this discussion, which cannot be a handle on the same open
file description as its previous value) or when the process owning that
stream terminates the
exit(2) or
abort(3C). A file descriptor is closed
by
close(),
_exit() (see
exit(2)), or by one of the
exec functions when
FD_CLOEXEC is set on that file descriptor.
For a handle to become the active handle, the actions below must be
performed between the last other user of the first handle (the current
active handle) and the first other user of the second handle (the future
active handle). The second handle then becomes the active handle. All
activity by the application affecting the file offset on the first handle
shall be suspended until it again becomes the active handle. (If a stream
function has as an underlying function that affects the file offset, the
stream function will be considered to affect the file offset. The
underlying functions are described below.)
The handles need not be in the same process for these rules to apply.
Note that after a
fork(), two handles exist where one existed before.
The application shall assure that, if both handles will ever be accessed,
that they will both be in a state where the other could become the active
handle first. The application shall prepare for a
fork() exactly as if
it were a change of active handle. (If the only action performed by one
of the processes is one of the
exec functions or
_exit(), the handle is
never accessed in that process.)
1. For the first handle, the first applicable condition below
shall apply. After the actions required below are taken, the
handle may be closed if it is still open.
a. If it is a file descriptor, no action is required.
b. If the only further action to be performed on any handle
to this open file description is to close it, no action
need be taken.
c. If it is a stream that is unbuffered, no action need be
taken.
d. If it is a stream that is line-buffered and the last
character written to the stream was a newline (that is, as
if a
putc('\n') was the most recent operation on that
stream), no action need be taken.
e. If it is a stream that is open for writing or append (but
not also open for reading), either an
fflush(3C) shall
occur or the stream shall be closed.
f. If the stream is open for reading and it is at the end of
the file (
feof(3C) is true), no action need be taken.
g. If the stream is open with a mode that allows reading and
the underlying open file description refers to a device
that is capable of seeking, either an
fflush() shall occur
or the stream shall be closed.
h. Otherwise, the result is undefined.
2. For the second handle: if any previous active handle has
called a function that explicitly changed the file offset,
except as required above for the first handle, the application
shall perform an
lseek() or an
fseek(3C) (as appropriate to
the type of the handle) to an appropriate location.
3. If the active handle ceases to be accessible before the
requirements on the first handle above have been met, the
state of the open file description becomes undefined. This
might occur, for example, during a
fork() or an
_exit().
4. The
exec functions shall be considered to make inaccessible
all streams that are open at the time they are called,
independent of what streams or file descriptors may be
available to the new process image.
5. Implementation shall assure that an application, even one
consisting of several processes, shall yield correct results
(no data is lost or duplicated when writing, all data is
written in order, except as requested by seeks) when the rules
above are followed, regardless of the sequence of handles
used. If the rules above are not followed, the result is
unspecified. When these rules are followed, it is
implementation defined whether, and under what conditions, all
input is seen exactly once.
Use of stdio in Multithreaded Applications
All the
stdio functions are safe unless they have the
_unlocked suffix.
Each
FILE pointer has its own lock to guarantee that only one thread can
access it. In the case that output needs to be synchronized, the lock for
the
FILE pointer can be acquired before performing a series of
stdio operations. For example:
FILE iop;
flockfile(iop);
fprintf(iop, "hello ");
fprintf(iop, "world);
fputc(iop, 'a');
funlockfile(iop);
will print everything out together, blocking other threads that might
want to write to the same file between calls to
fprintf().
An unlocked interface is available in case performace is an issue. For
example:
flockfile(iop);
while (!feof(iop)) {
*c++ = getc_unlocked(iop);
}
funlockfile(iop);
RETURN VALUES
Invalid stream pointers usually cause grave disorder, possibly including
program termination. Individual function descriptions describe the
possible error conditions.
SEE ALSO
close(2),
lseek(2),
open(2),
pipe(2),
read(2),
write(2),
ctermid(3C),
cuserid(3C),
fclose(3C),
ferror(3C),
fmemopen(3C),
fopen(3C),
fread(3C),
fseek(3C),
flockfile(3C),
getc(3C),
gets(3C),
open_memstream(3C),
open_wmemstream(3C(,
popen(3C),
printf(3C),
putc(3C),
puts(3C),
scanf(3C),
setbuf(3C),
system(3C),
tmpfile(3C),
tmpnam(3C),
ungetc(3C) March 25, 2020
STDIO(3C)