stdin, stdout, stderr - flujos de la E/S estándar
Biblioteca Estándar C (
libc,
-lc)
#include <stdio.h>
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;
Bajo condiciones normales cualquier programa UNIX tiene tres flujos de E/S
abiertos cuando arranca: uno para la entrada, otro para la salida y otro para
imprimir los diagnósticos o mensajes de error. Estos flujos
están típicamente ligados al terminal de usuario (ver
tty(4)) pero podrían referirse a ficheros o a otros
dispositivos, según lo que decida el proceso padre. (Ver también
la sección "Redirección" de
sh(1).)
El flujo de entrada se conoce como "entrada estándar"; el flujo
de salida como "salida estándar"; y el flujo de error como
"error estándar". Estos términos se abrevian para
formar los símbolos utilizados para referirse a esos ficheros, esto es,
stdin,
stdout y
stderr.
Cada uno de estos símbolos es una macro de
stdio(3) del tipo
"puntero a
FILE" y pueden ser utilizados por funciones como
fprintf(3) o
fread(3).
Since
FILEs are a buffering wrapper around UNIX file descriptors, the
same underlying files may also be accessed using the raw UNIX file interface,
that is, the functions like
read(2) and
lseek(2).
On program startup, the integer file descriptors associated with the streams
stdin,
stdout, and
stderr are 0, 1, and 2, respectively.
The preprocessor symbols
STDIN_FILENO,
STDOUT_FILENO, and
STDERR_FILENO are defined with these values in
<unistd.h>.
(Applying
freopen(3) to one of these streams can change the file
descriptor number associated with the stream.)
Es necesario tener en cuenta que la mezcla de
FILEs y descriptores de
fichero crudos puede producir resultados inesperados y se debería
evitar. (Para los masoquistas: POSIX.1, section 8.2.3, describe en detalle
cómo se supone que funciona esta interacción). Una regla general
es que los descriptores de fichero son gestionados por el núcleo,
mientras que stdio es una simple biblioteca. Esto significa, por ejemplo, que
tras un
exec(3), el hijo hereda todos los descriptores de ficheros
abiertos, pero los flujos antiguos se hacen inaccesibles.
Ya que los símbolos
stdin,
stdout y
stderr son
especificados como macros, las asignaciones a ellos no son portables. Se puede
hacer que los flujos estándares referencien a otros ficheros con ayuda
de la función de biblioteca
freopen(3), introducida
especialmente para hacer posible reasignar
stdin,
stdout y
stderr. Los flujos estándares se cierran llamando a
exit(3) y por la terminación normal del programa.
The
stdin,
stdout, and
stderr macros conform to C99 and
this standard also stipulates that these three streams shall be open at
program startup.
El flujo
stderr no utiliza búffers. El flujo
stdout tiene
un búffer de líneas cuando apunta a un terminar. Las
líneas no aparecen hasta que se llama a
fflush(3) o a
exit(3), o se imprime una nueva línea ("\n"). Esto
puede producir resultados inesperados, especialmente en depuración. El
modo "buffer" de los flujos estándares (o de cualquier otro
flujo) se puede cambiar con llamadas a
setbuf(3) o
setvbuf(3).
Es necesario tener en cuenta que en caso de que
stdin esté
asociado con un terminal, podría haber también entrada
vía buffer en el driver del terminal, sin relación alguna con el
búffer de stdio. (De hecho, las entradas normales de terminal utilizan
un búffer de líneas en el núcleo). Esta gestión de
entradas del núcleo puede ser modificada utilizando llamadas como
tcsetattr(3); ver también
stty(1) y
termios(3).
csh(1),
sh(1),
open(2),
fopen(3),
stdio(3)
La traducción al español de esta página del manual fue
creada por Carlos Costa Portela <
[email protected]> y Juan Piernas
<
[email protected]>
Esta traducción es documentación libre; lea la
GNU
General Public License Version 3 o posterior con respecto a las
condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.
Si encuentra algún error en la traducción de esta página
del manual, envíe un correo electrónico a
[email protected]