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 performance 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) February 17, 2023 STDIO(3C)