stdio(3C)
NAME
stdio - standard buffered input/output package
SYNOPSIS
#include <stdio.h>
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;
DESCRIPTION
The functions described in the entries of section 3S of this
manual constitute an efficient, user-level I/O buffering
scheme. The in-line macros getc() and putc() handle charac-
ters 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. 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 max-
imum 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.
The functions and constants mentioned in the entries of sec-
tion 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 termi-
nal. 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 char-
acter is written or terminal input is requested). The set-
buf() 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 descrip-
tion 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 descrip-
tor 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 con-
sidered 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 func-
tions or _exit(), the handle is never accessed in that pro-
cess.)
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 han-
dle 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 inaccessi-
ble 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, possi-
bly 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), fopen(3C),
fread(3C), fseek(3C), flockfile(3C), getc(3C), gets(3C),
popen(3C), printf(3C), putc(3C), puts(3C), scanf(3C),
setbuf(3C), system(3C), tmpfile(3C), tmpnam(3C), ungetc(3C)
Man(1) output converted with
man2html