En programación informática , los flujos estándar son canales de comunicación de entrada y salida preconectados [ 1 ] entre un programa informático y su entorno cuando comienza su ejecución. Las tres conexiones de entrada/salida (E/S) se denominan entrada estándar ( stdin ), salida estándar ( stdout ) y error estándar ( stderr ). Originalmente, la E/S se realizaba a través de una consola del sistema conectada físicamente (entrada mediante teclado, salida mediante monitor), pero los flujos estándar abstraen esto. Cuando se ejecuta un comando a través de un intérprete de comandos interactivo , los flujos suelen estar conectados al terminal de texto en el que se ejecuta el intérprete, pero pueden cambiarse mediante redirección o tubería . De forma más general, un proceso hijo hereda los flujos estándar de su proceso padre .
Solicitud

Los usuarios suelen conocer los flujos estándar como canales de entrada y salida que gestionan los datos provenientes de un dispositivo de entrada o que escriben datos desde la aplicación. Los datos pueden ser texto con cualquier codificación o datos binarios . Cuando un programa se ejecuta como un demonio , su flujo de error estándar se redirige a un archivo de registro, generalmente para el análisis de errores.
Los flujos de datos pueden utilizarse para encadenar aplicaciones, lo que significa que el flujo de salida de un programa puede redirigirse para que sirva de entrada a otra aplicación. En muchos sistemas operativos, esto se representa mediante una lista con los nombres de las aplicaciones, separadas por una barra vertical, conocida por este motivo como canalización . Un ejemplo conocido es el uso de una aplicación de paginación , como `more` , que permite al usuario controlar la visualización del flujo de salida en la pantalla.
Fondo
En la mayoría de los sistemas operativos anteriores a Unix , los programas debían conectarse explícitamente a los dispositivos de entrada y salida correspondientes. Las particularidades de cada sistema operativo convertían esta tarea de programación en algo tedioso. En muchos sistemas, era necesario controlar la configuración del entorno, acceder a una tabla de archivos local, determinar el conjunto de datos deseado y gestionar correctamente el hardware, como un lector de tarjetas perforadas , una unidad de cinta magnética , una unidad de disco , una impresora de línea , una perforadora de tarjetas o un terminal interactivo.
Uno de los avances más revolucionarios de Unix fueron los dispositivos abstractos , que eliminaron la necesidad de que un programa supiera o se preocupara por el tipo de dispositivos con los que se comunicaba . Los sistemas operativos antiguos obligaban al programador a utilizar una estructura de registro y, con frecuencia, una semántica de datos y un control de dispositivos no ortogonales . Unix eliminó esta complejidad con el concepto de flujo de datos: una secuencia ordenada de bytes de datos que se puede leer hasta el final del archivo . Un programa también puede escribir bytes según lo desee, sin necesidad de hacerlo, y no puede declarar fácilmente su cantidad o agrupación.
Otro avance importante de Unix fue asociar automáticamente la entrada y la salida al teclado y la pantalla del terminal, respectivamente, por defecto. El programa (y el programador) no hacían absolutamente nada para establecer la entrada y la salida en un programa típico de entrada-proceso-salida (a menos que optaran por un paradigma diferente). En contraste, los sistemas operativos anteriores generalmente requerían algún lenguaje de control de tareas, a menudo complejo , para establecer conexiones, o bien el programa debía encargarse de esta tarea.
Dado que Unix proporcionaba flujos estándar, el entorno de ejecución de C en Unix también estaba obligado a admitirlos. Como resultado, la mayoría de los entornos de ejecución de C (y sus derivados ), independientemente del sistema operativo, ofrecen una funcionalidad equivalente.
Entrada estándar (stdin)
La entrada estándar es un flujo de datos desde el cual un programa lee sus datos de entrada. El programa solicita transferencias de datos mediante la operación de lectura . No todos los programas requieren entrada de flujo. Por ejemplo, los programas `dir` y `ls` (que muestran los nombres de los archivos contenidos en un directorio) pueden aceptar argumentos de línea de comandos , pero realizan sus operaciones sin ninguna entrada de datos de flujo.
A menos que se redirija , la entrada estándar se hereda del proceso padre. En el caso de un intérprete de comandos interactivo, esto generalmente se asocia con el dispositivo de entrada de una terminal (o pseudoterminal ) que, en última instancia, está vinculada al teclado del usuario .
En los sistemas POSIX , el descriptor de archivo para la entrada estándar es 0 (cero); la definición POSIX es ; [ 2 ] la abstracción C correspondiente se proporciona a través de la variable global (de tipo ). De manera similar en C++ , el objeto global (de tipo ). proporcionado en , proporciona una abstracción a través de flujos de C++ . Existen abstracciones similares en las bibliotecas de E/S estándar de prácticamente todos los lenguajes de programación .<unistd.h>STDIN_FILENO<stdio.h>stdinFILE*std::cinstd::istream<iostream>
Salida estándar (stdout)
La salida estándar es un flujo de datos al que un programa escribe su salida. El programa solicita la transferencia de datos con la operación de escritura . No todos los programas generan salida. Por ejemplo, el comando para renombrar archivos (también llamado mv , move o ren ) no muestra ningún mensaje cuando la operación se realiza correctamente.
A menos que se redirija , la salida estándar se hereda del proceso padre. En el caso de un intérprete de comandos interactivo, suele ser la terminal de texto que inició el programa.
El descriptor de archivo para la salida estándar es 1 (uno); la definición POSIX es ; [ 2 ] la variable C correspondiente es (de tipo ); de manera similar en C++, el objeto global (de tipo ), proporcionado en , abstrae el flujo de salida.<unistd.h>STDOUT_FILENO<stdio.h>stdoutFILE*std::coutstd::ostream<iostream>
Error estándar (stderr)
El error estándar es otro flujo de salida que suelen usar los programas para mostrar mensajes de error o diagnósticos. Es un flujo independiente de la salida estándar y puede redirigirse por separado.
Esto resuelve el problema del semipredicado , permitiendo distinguir entre la salida y los errores, y es análogo a una función que devuelve un par de valores (véase Problema del semipredicado § Retorno multivalorado ). El destino habitual es la terminal de texto que inició el programa para ofrecer la mejor posibilidad de ser visto incluso si la salida estándar se redirige (por lo que no se observa fácilmente). Por ejemplo, la salida de un programa en una tubería se redirige a la entrada del siguiente programa o a un archivo de texto, pero las indicaciones y los errores de cada programa siguen yendo directamente a la terminal de texto para que el usuario pueda revisarlos en tiempo real.
Es aceptable y normal dirigir la salida estándar y el error estándar al mismo destino, como la terminal de texto. Los mensajes aparecen en el mismo orden en que el programa los escribe, a menos que se utilice un búfer . Por ejemplo, en situaciones comunes, la secuencia de error estándar no tiene búfer, pero la secuencia de salida estándar sí lo tiene; en este caso, el texto escrito posteriormente en el error estándar puede aparecer antes en la terminal, si el búfer de la secuencia de salida estándar aún no está lleno.
El descriptor de archivo para el error estándar está definido por POSIX como 2 (dos); el archivo de cabecera < unistd.h>STDERR_FILENO proporciona el símbolo ; [ 2 ]<stdio.h> la variable C correspondiente es stderr(de tipo FILE*). De manera similar, C++ proporciona dos objetos globales asociados con este flujo: std::cerry std::clog(cada uno de tipo std::ostream), en <iostream>, siendo el primero sin búfer y el segundo utilizando el mismo mecanismo de almacenamiento en búfer que todos los demás flujos de C++.
Los shells de estilo Bourne permiten que el error estándar se redirija al mismo destino al que se dirige la salida estándar.
2 > y 1
Los shells de estilo csh permiten que el error estándar se redirija al mismo destino al que se dirige la salida estándar.
> y
El error estándar se añadió a Unix en la década de 1970 después de que varias ejecuciones de fotocomposición desperdiciadas terminaran con mensajes de error impresos en lugar de mostrados en la terminal del usuario. [ 3 ]
Cronología
Década de 1950: Fortran
Fortran tiene el equivalente a los descriptores de archivo de Unix: por convención, muchas implementaciones de Fortran usan números de unidad UNIT=5para stdin, UNIT=6para stdout y UNIT=0para stderr. [ 4 ] En Fortran 2003, el ISO_FORTRAN_ENVmódulo intrínseco se estandarizó para incluir las constantes con nombre INPUT_UNIT, OUTPUT_UNIT, y ERROR_UNITpara especificar de forma portátil los números de unidad. [ 5 ]
! Ejemplo de FORTRAN 77 PROGRAMA PRINCIPAL NÚMERO ENTERO LEER ( UNIDAD = 5 , * ) NÚMERO ESCRIBIR ( UNIDAD = 6 , '(A,I3)' ) ' EL NÚMERO ES: ' , NÚMERO FIN! Programa de ejemplo de Fortran 2003 main use iso_fortran_env implicit none integer :: number read ( unit = INPUT_UNIT , * ) number write ( unit = OUTPUT_UNIT , '(a,i3)' ) 'El número es: ' , number end program1960: ALGOL 60
ALGOL 60 fue criticado por no tener un sistema estándar de acceso a archivos.
1968: ALGOL 68
Las instalaciones de entrada y salida de ALGOL 68 se denominaban colectivamente transput. [ 6 ] Koster coordinó la definición del estándar de transput . El modelo incluía tres canales estándar: stand in, stand out, y stand back.
1968: Simula
Otro ejemplo es el lenguaje de programación orientada a objetos (POO). [ 7 ]
clase BASICIO ( LINELENGTH ) ; entero LINELENGTH ; inicio ref ( infile ) SYSIN ; ref ( infile ) procedimiento sysin ; sysin :- SYSIN ; ref ( printfle ) SYSOUT ; ref ( printfle ) procedimiento sysout ; sysout :- SYSOUT ;clase ARCHIVO ....................; ARCHIVO clase archivo_entrada ............; ARCHIVO clase archivo_salida ...........; ARCHIVO clase archivo_directo ........; archivo_salida clase archivo_imprimir .......;SYSIN :- nuevo infile ( " SYSIN " ) ; SYSOUT :- nuevo printfle ( " SYSOUT " ) ; SYSIN . open ( blanks ( 80 )) ; SYSOUT . open ( blanks ( LINELENGTH )) ; inner ; SYSIN . close ; SYSOUT . close ; end BASICIO ;Década de 1970: C y Unix
En el lenguaje de programación C , las secuencias estándar de entrada, salida y error se asocian a los descriptores de archivo Unix existentes 0, 1 y 2, respectivamente. [ 8 ] En un entorno POSIX, se deben usar las definiciones < unistd.h > STDIN_FILENO , STDOUT_FILENO o STDERR_FILENO en lugar de números mágicos . También se proporcionan punteros de archivo stdin , stdout y stderr .
Ken Thompson (diseñador e implementador del sistema operativo Unix original) modificó sort en la versión 5 de Unix para que aceptara "-" como entrada estándar, lo que se extendió a otras utilidades y se convirtió en parte del sistema operativo como un archivo especial en la versión 8. Los diagnósticos formaron parte de la salida estándar hasta la versión 6 , después de la cual Dennis M. Ritchie creó el concepto de error estándar. [ 9 ]
Década de 1990: C++, Java
En C++ , la escritura en flujos estándar se realizaba originalmente utilizando el <iostream>encabezado y sus flujos, hasta que el lanzamiento de <print>simplificó la entrada/salida mediante funciones de impresión. [ 10 ] C++ hereda las funcionalidades de CI/O , pero se considera más idiomático utilizar las funcionalidades más recientes de C++. [ 11 ]
#include <iostream> #include <string>using std :: cerr ; using std :: cin ; using std :: cout ; using std :: endl ; using std :: string ;int main () { string input ; cout << " Escribe una oración: " << endl ; cin >> input ; int inputLength = input.length ( ); cout << "Oración: " << input << ", de longitud " << inputLength << endl ; cerr << "Oración escrita en stderr: " << input << endl ; }En Java , los flujos estándar se denominan System.in(para stdin), System.out(para stdout) y System.err(para stderr). [ 12 ] También es posible leer desde cualquier flujo de entrada usando un Scanner.
paquete org.wikipedia.examples ;import java.io.BufferedReader ; import java.io.IOException ; import java.io.InputStreamReader ;public class Example { public static void main ( String args [] ) { try { BufferedReader br = new BufferedReader ( new InputStreamReader ( System . in )); String s = br . readLine (); double number = Double . parseDouble ( s ); System . out . printf ( "El número es: %d%n" , number );// Leer la entrada para un nombre y edad: Scanner input = new Scanner ( System . in ); System . out . printf ( "%nIngrese el nombre: " ); String name = input . nextLine (); System . out . printf ( "%nIngrese la edad: " ); int age = input . nextInt (); System . out . printf ( "Hola, %s! Tienes %d años." , name , age ); } catch ( IOException e ) { System . err . printf ( "Error en la entrada/salida: %s%n" , e . getMessage ()); } catch ( Exception e ) { System . err . printf ( "Error: %s%n" , e . getMessage ()); } } }Década de 2000: .NET
En C# y otros lenguajes .NET , los flujos estándar se denominan System.Console.In(para stdin), System.Console.Out(para stdout) y System.Console.Error(para stderr). [ 13 ] Las capacidades básicas de lectura y escritura para los flujos stdin y stdout también son accesibles directamente a través de la clase System.Console(por ejemplo, System.Console.WriteLine()se puede usar en lugar de System.Console.Out.WriteLine()).
System.Console.Iny son respectivamente objetos (stdin) y System.Console.Out( stdout, stderr), que solo permiten el acceso a los flujos estándar subyacentes en base al texto. El acceso binario completo a los flujos estándar debe realizarse a través de los objetos devueltos por y respectivamente .System.Console.ErrorSystem.IO.TextReaderSystem.IO.TextWriterSystem.IO.StreamSystem.Console.OpenStandardInput()System.Console.OpenStandardOutput()System.Console.OpenStandardError()
espacio de nombres Wikipeda.Examples ;usando el sistema ;public class Example { static int Main ( string [] args ) { try { string s = Console . In . ReadLine (); double number = Double . Parse ( s ); Console . Out . WriteLine ( "El número es: {0:F3}" , number ); } // Si Parse() lanzó una excepción catch ( ArgumentNullException e ) { Console . Error . WriteLine ( $"No se ingresó ningún número: {e.Message}" ); return 1 ; } catch ( FormatException e ) { Console . Error . WriteLine ( $"El valor especificado no es un número válido: {e.Message}" ); return 2 ; } catch ( OverflowException e ) { Console . Error . WriteLine ( $"El número especificado es demasiado grande: {e.Message}" ); return 3 ; } catch ( Exception ex ) { Console . Error . WriteLine ( $"Se produjo una excepción desconocida: {e.Message}" ); return - 1 ; } return 0 ; }Ejemplo de Visual Basic .NETFunción pública principal () como entero Try Dim s como cadena = System . Console . [ In ] . ReadLine () Dim number como doble = doble . Parse ( s ) System . Console . Out . WriteLine ( "El número es: {0:F3}" , number ) Return 0' Si Parse() lanzó una excepción Catch ex As System . ArgumentNullException System . Console . [ Error ] . WriteLine ( "¡No se ingresó ningún número!" ) Catch ex2 As System . FormatException System . Console . [ Error ] . WriteLine ( "¡El valor especificado no es un número válido!" ) Catch ex3 As System . OverflowException System . Console . [ Error ] . WriteLine ( "¡El número especificado es demasiado grande!" ) End TryRetorno - 1 Fin de la funciónAl aplicar la System.Diagnostics.Processclase, se pueden usar las propiedadesStandardInput de instancia , StandardOutput, y StandardErrorde esa clase para acceder a los flujos estándar del proceso.
A partir de la década del 2000: Python, C++
El siguiente ejemplo, escrito en Python , muestra cómo redirigir la entrada estándar tanto a la salida estándar como a un archivo de texto.
#!/usr/bin/env pythonimportar sysfrom typing import TextIOSi __name__ == "__main__" :# Guarda la salida estándar actual para que podamos revertir sys.stdout# después de completar nuestra redirecciónstdin_fileno : TextIO = sys . entrada estándarstdout_fileno : TextIO = sys.stdout# Redirigir sys.stdout al archivosys.stdout : TextIO = open ( "myfile.txt" , " w " )ctr : int = 0para inps en stdin_fileno :ctrs : str = str ( ctr )# Imprime en la salida estándar redirigida ()sys.stdout.write ( f " { ctrs } ) esto es a la redirección --- > { inps } \ n " )# Imprime en el manejador de salida estándar guardado.stdout_fileno.write ( f " { ctrs } ) esto es para el actual ---> { inps } \ n " )ctr = ctr + 1# Cierra el archivosys.stdout.close ( )# Restaurar sys.stdout a nuestro antiguo manejador de archivos guardadossys.stdout = stdout_filenoEn C++23 , se creó una interfaz de impresión actualizada para escribir en el flujo de salida, utilizando std::printfunciones. [ 14 ]
importar std ;usando std :: string ;int main () { string s = "¡Hola, mundo!" ; std :: println ( stdout , "Mi cadena: {}" , s ); std :: println ( stderr , "Cadena al flujo de error: {}" , s ); }interfaces gráficas de usuario
Las interfaces gráficas de usuario (GUI) no siempre utilizan los flujos estándar; lo hacen cuando las GUI son envoltorios de scripts subyacentes o programas de consola, por ejemplo, la GUI del gestor de paquetes Synaptic , que encapsula comandos apt en Debian o Ubuntu. Las GUI creadas con herramientas de scripting como Zenity y KDialog del proyecto KDE [ 15 ] utilizan stdin, stdout y stderr, y se basan en scripts simples en lugar de una GUI completa programada y compilada en C/C++ usando Qt , GTK u otro marco de widgets propietario equivalente.
El menú Servicios , tal como se implementa en NeXTSTEP y Mac OS X , también es análogo a los flujos estándar. En estos sistemas operativos, las aplicaciones gráficas pueden proporcionar funcionalidades a través de un menú global que opera sobre la selección actual en la interfaz gráfica de usuario, independientemente de la aplicación.
Algunos programas con interfaz gráfica de usuario (GUI), principalmente en Unix, aún escriben información de depuración en la salida de error estándar. Otros (como muchos reproductores multimedia de Unix) pueden leer archivos desde la entrada estándar. Los programas populares de Windows que abren una ventana de consola separada además de sus ventanas GUI son los emuladores pSX y DOSBox .
GTK-server puede usar stdin como interfaz de comunicación con un programa interpretado para crear una interfaz gráfica de usuario (GUI).
El paradigma del Administrador de Interfaz de Common Lisp "presenta" elementos de la interfaz gráfica de usuario enviados a un flujo de salida extendido.
Véase también
Referencias
- ↑ Ritchie, Dennis M. (octubre de 1984). "Un sistema de entrada-salida de flujo" (PDF) . AT&T Bell Laboratories Technical Journal . 68 (8): 1897–1910 .
- 1 2 3 Stevens, W. Richard ; Rago, Stephen A. (2013). Programación avanzada en el entorno UNIX (Tercera ed.). Addison-Wesley . pág. 62. ISBN 978-0-321-63773-4Consultado el 13 de junio de 2026 .
- ↑ Johnson, Steve (11 de diciembre de 2013). " [ TUHS ] Fotocompositora C/A/T de sistemas gráficos" (Lista de correo). Archivado del original el 25 de septiembre de 2020. Recuperado el 7 de noviembre de 2020 .
- ↑ Feldman, SI ; Weinberger, PJ (agosto de 1978). "Un compilador portátil de Fortran 77" (PDF) . Manual del programador de UNIX . Vol. 2 (séptima ed.). Bell Laboratories (publicado en 1983). págs. 410, 415–416 . ISBN 0-03-061743-XArchivado del original el 16 de junio de 2026. Consultado el 13 de junio de 2026 .
{{cite book}}: CS1 maint: bot: estado de la URL original desconocido ( enlace ) - ↑ Reid, John (abril de 2007). "Las nuevas características de Fortran 2003" . Fortran Forum . 26 (1). SIGPLAN : 21. doi : 10.1145/1243413.1243415 .
- ↑ van Wijngaarden, A .; Mailloux, BJ ; Peck, JEL ; Koster, CHA ; Sintzoff, M .; Lindsey, CH ; Meertens, LGLT ; Fisker, RG Informe revisado sobre el lenguaje algorítmico Algol 68 (PDF) (Reporte). segundo. 10.3.
- ↑ Dahl, Ole Johan ; Myhrhaug, Bjørn; Nygaard, Kristen (1970). Lenguaje base común (PDF) (Reporte). Centro de Computación de Noruega . pag. 11. Archivado desde el original el 19 de septiembre de 2024 . Consultado el 20 de agosto de 2025 .
- ↑ "Stdin(3): Flujos de E/S estándar - Página man de Linux" . die.net . Archivado del original el 8 de junio de 2023. Consultado el 13 de junio de 2026 .
- ↑ McIlroy, MD (1987). Un lector de Research Unix: extractos anotados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139. Archivado (PDF) del original el 15 de diciembre de 2023.
- ^ Stroustrup, Bjarne (1993). "Una historia de C++: 1979-1991" (PDF) . doi : 10.1145/154766.155375 .
- ↑ Stroustrup, Bjarne (1997). El lenguaje de programación C++ (Tercera ed.). Addison-Wesley . págs. 637–640 . ISBN 0-201-88954-4.
- ↑ "Sistema (Plataforma Java SE 7)" . Centro de ayuda de Oracle . Consultado el 20 de julio de 2012 .
- ↑ ".NET Framework 4.7.1, mscorlib, console.cs" . Fuente de referencia: Microsoft . Archivado del original el 10 de diciembre de 2017. Consultado el 10 de diciembre de 2017 .
- ↑ Zverovich, Victor (25 de marzo de 2022). Salida formateada . open-std.org (Informe). WG 21 .
- ↑ Kißling, Kristian (febrero de 2009). "Añadir elementos gráficos a tus scripts con Zenity y KDialog" . Linux Magazine . N.º 99. p. . Consultado el 11 de abril de 2021 .
Lecturas adicionales
- Manual de referencia de KRONOS 2.1 (PDF) . Control Data Corporation . 17 de junio de 1975. N.° 60407000D. Archivado (PDF) del original el 15 de agosto de 2011. Consultado el 13 de junio de 2026 .
- Lions, John (1977). Un comentario sobre la sexta edición del sistema operativo UNIX . Universidad de Nueva Gales del Sur . ISBN 1-57398-013-7. Archivado (PDF) del original el 30 de julio de 2004. Recuperado el 13 de junio de 2026 .
- NOS Versión 1 Aplicaciones Programador Instantáneo (PDF) . Control Data Corporation. 24 de enero de 1980. N.° 60436000H. Archivado (PDF) del original el 14 de marzo de 2011. Recuperado el 13 de junio de 2026 .
- "Introducción a la programación en MULTICS, nivel 68" (PDF) . Honeywell Corporation . Julio de 1981. Archivado del original (PDF) el 25 de febrero de 2021.
- «La evolución del sistema operativo MVS» (PDF) . IBM Corporation . 1981. doi : 10.1147/rd.255.0471 . Archivado del original (PDF) el 9 de octubre de 2019.
- "Standard Streams" . Manual de referencia de la biblioteca C de GNU . Fundación del Software Libre . 6 de julio de 2001. Archivado del original el 21 de febrero de 2004. Consultado el 13 de junio de 2026 .
{{cite book}}: CS1 maint: bot: estado de la URL original desconocido ( enlace ) - "Biblioteca de clases de .NET Framework – Clase de consola" . Microsoft Developer Network . Archivado del original el 21 de julio de 2006. Consultado el 13 de junio de 2026 .
Enlaces externos
- Definición de entrada estándar - por The Linux Information Project
- Definición de salida estándar - por The Linux Information Project
- Definición de error estándar - por The Linux Information Project
- Entrada/salida
- Unix