Standard streams: Difference between revisions
paragraph break, clarification, source |
Aadirulez8 (talk | contribs) m v2.05 - Autofix / Fix errors for CW project (Link equal to linktext) |
||
(28 intermediate revisions by 21 users not shown) | |||
Line 1: | Line 1: | ||
{{Short description|Connected input and output streams for computer programs}} |
{{Short description|Connected input and output streams for computer programs}} |
||
{{About|standard I/O file descriptors|System V streams|STREAMS}} |
{{About|standard I/O file descriptors|System V streams|STREAMS}} |
||
In [[computer programming]], '''standard streams''' are |
In [[computer programming]], '''standard streams''' are preconnected input and output [[communication channel]]s<ref>D. M. Ritchie, [https://cseweb.ucsd.edu/classes/fa01/cse221/papers/ritchie-stream-io-belllabs84.pdf "A Stream Input-Output System"], AT&T Bell Laboratories Technical Journal, 68(8), October 1984.</ref> between a computer program and its environment when it begins execution. The three [[input/output]] (I/O) connections are called '''standard input''' ('''stdin'''), '''standard output''' ('''stdout''') and '''standard error''' ('''stderr'''). Originally I/O happened via a physically connected [[system console]] (input via keyboard, output via monitor), but standard streams abstract this. When a command is executed via an interactive [[Shell (computing)|shell]], the streams are typically connected to the [[text terminal]] on which the shell is running, but can be changed with [[Redirection (computing)|redirection]] or a [[Pipeline (Unix)|pipeline]]. More generally, a [[child process]] inherits the standard streams of its [[parent process]]. |
||
==Application == |
==Application == |
||
[[File:Stdstreams-notitle.svg|thumb|right|The standard streams for input, output, and error|206x206px]] |
[[File:Stdstreams-notitle.svg|thumb|right|The standard streams for input, output, and error in a common default configuration|206x206px]] |
||
Users generally know standard streams as input and output channels that handle data coming from an input device, or that write data from the application. The data may be text with any encoding, or [[Binary file|binary data]]. |
Users generally know standard streams as input and output channels that handle data coming from an input device, or that write data from the application. The data may be text with any encoding, or [[Binary file|binary data]]. |
||
When a program is run as a [[Daemon (computing)|daemon]], its standard error stream is redirected into a log file, typically for error analysis purposes. |
|||
Streams may be used to chain applications, meaning that the output stream of one program can be redirected to be the input stream to another application. In many operating systems this is expressed by listing the application names, separated by the vertical bar character, for this reason often called the [[pipeline (Unix)|pipeline]] character. A well-known example is the use of a [[pagination]] application, such as [[more (command)|more]], providing the user control over the display of the output stream on the display. |
Streams may be used to chain applications, meaning that the output stream of one program can be redirected to be the input stream to another application. In many operating systems this is expressed by listing the application names, separated by the vertical bar character, for this reason often called the [[pipeline (Unix)|pipeline]] character. A well-known example is the use of a [[pagination]] application, such as [[more (command)|more]], providing the user control over the display of the output stream on the display. |
||
Line 23: | Line 23: | ||
Standard input is a stream from which a program reads its input data. The program requests data transfers by use of the ''read'' operation. Not all programs require stream input. For example, the ''[[dir (command)|dir]]'' and ''[[ls]]'' programs (which display file names contained in a directory) may take [[Command-line interface#Arguments|command-line arguments]], but perform their operations without any stream data input. |
Standard input is a stream from which a program reads its input data. The program requests data transfers by use of the ''read'' operation. Not all programs require stream input. For example, the ''[[dir (command)|dir]]'' and ''[[ls]]'' programs (which display file names contained in a directory) may take [[Command-line interface#Arguments|command-line arguments]], but perform their operations without any stream data input. |
||
Unless [[Redirection (computing)|redirected]], standard input is inherited from the parent process. In the case of an interactive shell, that is usually associated with the [[Keyboard (computing)|keyboard]]. |
Unless [[Redirection (computing)|redirected]], standard input is inherited from the parent process. In the case of an interactive shell, that is usually associated with the input device of a [[Computer terminal|terminal]] (or [[Pseudoterminal|pseudo terminal]]) which is ultimately linked to a user's [[Keyboard (computing)|keyboard]]. |
||
On [[POSIX]] systems, the [[file descriptor]] for standard input is 0 (zero); the [[POSIX]] <code><unistd.h></code> definition is <code>STDIN_FILENO</code>; the corresponding C <code><stdio.h></code> abstraction is provided via the <code>FILE* stdin</code> global variable. Similarly, the global C++ <code>std::cin</code> variable of type <code><iostream></code> provides an abstraction via [[Input/output_(C%2B%2B)#Input/output_streams|C++ streams]]. Similar abstractions exist in the standard I/O libraries of practically every [[programming language]]. |
|||
==Standard output (stdout)==<!-- This section is linked from [[COMMAND.COM]] --> |
==Standard output (stdout)==<!-- This section is linked from [[COMMAND.COM]] --> |
||
Standard output is a stream to which a program writes its output data. The program requests data transfer with the ''write'' operation. Not all programs generate output. For example, the ''[[rename (computing)|file rename]]'' command (variously called ''[[mv (Unix)|mv]]'', ''[[move (command)|move]]'', or ''[[ren (command)|ren]]'') is silent on success. |
Standard output is a stream to which a program writes its output data. The program requests data transfer with the ''write'' operation. Not all programs generate output. For example, the ''[[rename (computing)|file rename]]'' command (variously called ''[[mv (Unix)|mv]]'', ''[[move (command)|move]]'', or ''[[ren (command)|ren]]'') is silent on success. |
||
Unless [[Redirection ( |
Unless [[Redirection (computing)|redirected]], standard output is inherited from the parent process. In the case of an interactive shell, that is usually the [[text terminal]] which initiated the program. |
||
The [[file descriptor]] for standard output is 1 (one); the [[POSIX]] |
The [[file descriptor]] for standard output is 1 (one); the [[POSIX]] <code><unistd.h></code> definition is <code>STDOUT_FILENO</code>; the corresponding C <code><stdio.h></code> variable is <code>FILE* stdout</code>; similarly, the C++ <code><iostream></code> variable is <code>std::cout</code>. |
||
==Standard error (stderr)==<!-- This section is linked from [[COMMAND.COM]] --> |
==Standard error (stderr)==<!-- This section is linked from [[COMMAND.COM]] --> |
||
Standard error is another output stream typically used by programs to output [[error message]]s or diagnostics. It is a stream independent of standard output and can be redirected separately. |
Standard error is another output stream typically used by programs to output [[error message]]s or diagnostics. It is a stream independent of standard output and can be redirected separately. |
||
This solves the [[semipredicate problem|semi-predicate problem]], allowing output and errors to be distinguished, and is analogous to a function returning a pair of values – see |
This solves the [[semipredicate problem|semi-predicate problem]], allowing output and errors to be distinguished, and is analogous to a function returning a pair of values – see {{section link|Semipredicate problem|Multivalued return}}. The usual destination is the [[text terminal]] which started the program to provide the best chance of being seen even if ''standard output'' is redirected (so not readily observed). For example, output of a program in a [[pipeline (Unix)|pipeline]] is redirected to input of the next program or a text file, but errors from each program still go directly to the text terminal so they can be reviewed by the user in real time.<ref>{{cite web |title=What are stdin, stdout and stderr in Linux? {{!}} CodePre.com |url=https://codepre.com/en/was-sind-stdin-stdout-und-stderr-unter-linux.html |access-date=8 April 2022 |language=en |date=2 December 2021}}</ref> |
||
It is acceptable and normal to direct ''standard output'' and ''standard error'' to the same destination, such as the text terminal. Messages appear in the same order as the program writes them, unless [[Data buffer|buffering]] is involved. For example, in common situations the standard error stream is unbuffered but the standard output stream is line-buffered; in this case, text written to standard error later may appear on the terminal earlier, if the standard output stream buffer is not yet full. |
It is acceptable and normal to direct ''standard output'' and ''standard error'' to the same destination, such as the text terminal. Messages appear in the same order as the program writes them, unless [[Data buffer|buffering]] is involved. For example, in common situations the standard error stream is unbuffered but the standard output stream is line-buffered; in this case, text written to standard error later may appear on the terminal earlier, if the standard output stream buffer is not yet full. |
||
The [[file descriptor]] for standard error is defined by [[POSIX]] as 2 (two); the ''<unistd.h>'' header file provides the symbol <code>STDERR_FILENO</code>;<ref>{{cite web |url=http://pubs.opengroup.org/onlinepubs/009695399/basedefs/unistd.h.html |work=The Open Group Base Specifications Issue 6—IEEE Std 1003.1, 2004 Edition |title=<unistd.h> |publisher=The Open Group |year=2004 }}</ref> the corresponding C |
The [[file descriptor]] for standard error is defined by [[POSIX]] as 2 (two); the ''<unistd.h>'' header file provides the symbol <code>STDERR_FILENO</code>;<ref>{{cite web |url=http://pubs.opengroup.org/onlinepubs/009695399/basedefs/unistd.h.html |work=The Open Group Base Specifications Issue 6—IEEE Std 1003.1, 2004 Edition |title=<unistd.h> |publisher=The Open Group |year=2004 }}</ref> the corresponding C <code><stdio.h></code> variable is <code>FILE* stderr</code>. The C++ <code><iostream></code> standard header provides two variables associated with this stream: <code>std::cerr</code> and <code>std::clog</code>, the former being unbuffered and the latter using the same buffering mechanism as all other C++ streams. |
||
[[Bourne shell|Bourne]]-style shells allow ''standard error'' to be redirected to the same destination that standard output is directed to using |
[[Bourne shell|Bourne]]-style shells allow ''standard error'' to be redirected to the same destination that standard output is directed to using |
||
Line 78: | Line 78: | ||
=== 1968: ALGOL 68=== |
=== 1968: ALGOL 68=== |
||
⚫ | [[ALGOL 68]]'s input and output facilities were collectively referred to as the transput.<ref>"[http://www.softwarepreservation.org/projects/ALGOL/report/Algol68_revised_report-AB.pdf Revised Report on the Algorithmic Language Algol 68]", edited by A. van Wijngaarden, B.J. Mailloux, J.E.L. Peck, C.H.A. Koster, M. Sintzoff, C.H. Lindsey, L.G.L.T. Meertens and R.G. Fisker, Section 10.3.</ref> [[Cornelis H. A. Koster|Koster]] coordinated the definition of the ''transput'' standard. The model included three standard channels: <code>stand in</code>, <code>stand out</code>, and <code>stand back</code>. |
||
[[ALGOL 68]]'s input and output facilities were collectively referred to as the transput.<ref>Revised |
|||
Report on the Algorithmic Language Algol 68, Edited by |
|||
A. van Wijngaarden, |
|||
B.J. Mailloux, |
|||
J.E.L. Peck, |
|||
C.H.A. Koster, |
|||
M. Sintzoff, |
|||
C.H. Lindsey, |
|||
L.G.L.T. Meertens |
|||
⚫ | and |
||
{| |
{| |
||
Line 109: | Line 100: | ||
=== 1970s: C and Unix === |
=== 1970s: C and Unix === |
||
In the [[C programming language]], the standard input, output, and error streams are attached to the existing Unix file descriptors 0, 1 and 2 respectively.<ref>{{Cite web|url=http://linux.die.net/man/3/stdin|title = Stdin(3): Standard I/O streams - Linux man page}}</ref> In a [[POSIX]] environment the ''<[[unistd.h]]>'' definitions ''STDIN_FILENO'', ''STDOUT_FILENO'' or ''STDERR_FILENO'' should be used instead rather than [[Magic number (programming)|magic numbers]]. File pointers ''stdin'', ''stdout'', and ''stderr'' are also provided. |
In the [[C programming language]], the standard input, output, and error streams are attached to the existing Unix file descriptors 0, 1 and 2 respectively.<ref>{{Cite web|url=http://linux.die.net/man/3/stdin|title = Stdin(3): Standard I/O streams - Linux man page |website=die.net |url-status=live |archive-url=https://web.archive.org/web/20230608111413/https://linux.die.net/man/3/stdin |archive-date= Jun 8, 2023 }}</ref> In a [[POSIX]] environment the ''<[[unistd.h]]>'' definitions ''STDIN_FILENO'', ''STDOUT_FILENO'' or ''STDERR_FILENO'' should be used instead rather than [[Magic number (programming)|magic numbers]]. File pointers ''stdin'', ''stdout'', and ''stderr'' are also provided. |
||
[[Ken Thompson]] (designer and implementer of the original Unix operating system) modified [[sort (Unix)|sort]] in [[Version 5 Unix]] to accept "-" as representing standard input, which spread to other utilities and became a part of the operating system as a [[special file]] in [[Version 8 Unix|Version 8]]. Diagnostics were part of standard output through [[Version 6 Unix|Version 6]], after which [[Dennis M. Ritchie]] created the concept of standard error.<ref name="reader">{{cite |
[[Ken Thompson]] (designer and implementer of the original Unix operating system) modified [[sort (Unix)|sort]] in [[Version 5 Unix]] to accept "-" as representing standard input, which spread to other utilities and became a part of the operating system as a [[special file]] in [[Version 8 Unix|Version 8]]. Diagnostics were part of standard output through [[Version 6 Unix|Version 6]], after which [[Dennis M. Ritchie]] created the concept of standard error.<ref name="reader">{{cite tech report |first1=M. D. |last1=McIlroy |author-link1=Doug McIlroy |year=1987 |url=http://www.cs.dartmouth.edu/~doug/reader.pdf |title=A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 |series=CSTR |number=139 |institution=Bell Labs |url-status=live |archive-url=https://web.archive.org/web/20231215143742/https://www.cs.dartmouth.edu/~doug/reader.pdf |archive-date= Dec 15, 2023 }}</ref> |
||
===1995: Java === |
===1995: Java === |
||
In [[Java (programming language)|Java]], the standard streams are referred to by {{Javadoc:SE|java/lang|System|in}} (for stdin), {{Javadoc:SE|java/lang|System|out}} (for stdout), and {{Javadoc:SE|java/lang|System|err}} (for stderr).<ref>{{cite web|title=System (Java Platform SE 7)|url=http://docs.oracle.com/javase/7/docs/enwiki/api/java/lang/System.html|access-date=20 July 2012}}</ref> |
In [[Java (programming language)|Java]], the standard streams are referred to by {{Javadoc:SE|java/lang|System|in}} (for stdin), {{Javadoc:SE|java/lang|System|out}} (for stdout), and {{Javadoc:SE|java/lang|System|err}} (for stderr).<ref>{{cite web|title=System (Java Platform SE 7)|url=http://docs.oracle.com/javase/7/docs/enwiki/api/java/lang/System.html |website=Oracle Help Center |access-date=20 July 2012}}</ref> |
||
<syntaxhighlight lang="java"> |
<syntaxhighlight lang="java"> |
||
public static void main(String args[]) { |
public static void main(String args[]) { |
||
Line 130: | Line 121: | ||
===2000s: .NET === |
===2000s: .NET === |
||
In [[C Sharp (programming language)|C#]] and other [[.NET Framework|.NET]] languages, the standard streams are referred to by <code>System.Console.In</code> (for stdin), <code>System.Console.Out</code> (for stdout) and <code>System.Console.Error</code> (for stderr).<ref>{{Cite web|url=https://referencesource.microsoft.com/#mscorlib/system/console.cs,34|title= |
In [[C Sharp (programming language)|C#]] and other [[.NET Framework|.NET]] languages, the standard streams are referred to by <code>System.Console.In</code> (for stdin), <code>System.Console.Out</code> (for stdout) and <code>System.Console.Error</code> (for stderr).<ref>{{Cite web|url=https://referencesource.microsoft.com/#mscorlib/system/console.cs,34|title= .NET Framework 4.7.1, mscorlib, console.cs |website=Reference Source - Microsoft |access-date=2017-12-10 |url-status=live |archive-url= https://web.archive.org/web/20171210072215/https://referencesource.microsoft.com/#mscorlib/system/console.cs,34 |archive-date= Dec 10, 2017 }}</ref> Basic read and write capabilities for the stdin and stdout streams are also accessible directly through the class <code>System.Console</code> (e.g. <code>System.Console.WriteLine()</code> can be used instead of <code>System.Console.Out.WriteLine()</code>). |
||
<code>System.Console.In</code>, <code>System.Console.Out</code> and <code>System.Console.Error</code> are <code>System.IO.TextReader</code> (stdin) and <code>System.IO.TextWriter</code> (stdout, stderr) objects, which only allow access to the underlying standard streams on a text basis. Full binary access to the standard streams must be performed through the <code>System.IO.Stream</code> objects returned by <code>System.Console.OpenStandardInput()</code>, <code>System.Console.OpenStandardOutput()</code> and <code>System.Console.OpenStandardError()</code> respectively. |
<code>System.Console.In</code>, <code>System.Console.Out</code> and <code>System.Console.Error</code> are <code>System.IO.TextReader</code> (stdin) and <code>System.IO.TextWriter</code> (stdout, stderr) objects, which only allow access to the underlying standard streams on a text basis. Full binary access to the standard streams must be performed through the <code>System.IO.Stream</code> objects returned by <code>System.Console.OpenStandardInput()</code>, <code>System.Console.OpenStandardOutput()</code> and <code>System.Console.OpenStandardError()</code> respectively. |
||
Line 182: | Line 173: | ||
===2000 - : Python (2 or 3) === |
===2000 - : Python (2 or 3) === |
||
The following example shows how to redirect the standard input both to the standard output |
The following example, written in [[Python (programming language)|Python]], shows how to redirect the standard input both to the standard output |
||
and to a text file. |
and to a text file. |
||
Line 193: | Line 184: | ||
stdout_fileno = sys.stdout |
stdout_fileno = sys.stdout |
||
# Redirect sys.stdout to the file |
# Redirect sys.stdout to the file |
||
sys.stdout = open( |
sys.stdout = open("myfile.txt", "w") |
||
ctr = 0 |
ctr = 0 |
||
for inps in stdin_fileno: |
for inps in stdin_fileno: |
||
ctrs = str(ctr) |
ctrs = str(ctr) |
||
# Prints to the redirected stdout () |
# Prints to the redirected stdout () |
||
sys.stdout.write(ctrs + ") this is to the redirected --->" + inps + |
sys.stdout.write(ctrs + ") this is to the redirected --->" + inps + "\n") |
||
# Prints to the actual saved stdout handler |
# Prints to the actual saved stdout handler |
||
stdout_fileno.write(ctrs + ") this is to the actual --->" + inps + |
stdout_fileno.write(ctrs + ") this is to the actual --->" + inps + "\n") |
||
ctr = ctr + 1 |
ctr = ctr + 1 |
||
# Close the file |
# Close the file |
||
Line 209: | Line 200: | ||
===GUIs=== |
===GUIs=== |
||
[[Graphical user interface]]s (GUIs) |
[[Graphical user interface]]s (GUIs) do not always make use of the standard streams; they do when GUIs are wrappers of underlying scripts and/or console programs, for instance the [[Synaptic (software)|Synaptic]] package manager GUI, which wraps apt commands in Debian and/or Ubuntu. GUIs created with scripting tools like Zenity and KDialog by [[KDE]] project<ref>{{cite web |url=https://www.linux-magazine.com/Issues/2009/99/Zenity-and-KDialog |first=Kristian |last=Kißling |title=Adding graphic elements to your scripts with Zenity and KDialog |website=[[Linux Magazine]] |date=2009 |access-date=2021-04-11}}</ref> make use of stdin, stdout, and stderr, and are based on simple scripts rather than a complete GUI programmed and compiled in C/C++ using [[Qt (software)|Qt]], [[GTK]], or other equivalent proprietary widget framework. |
||
The [[Services menu]], as implemented on [[NeXTSTEP]] and [[Mac OS X]], is also analogous to standard streams. On these operating systems, graphical applications can provide functionality through a system-wide menu that operates on the current [[wikt:selection|selection]] in the GUI, no matter in what application. |
The [[Services menu]], as implemented on [[NeXTSTEP]] and [[Mac OS X]], is also analogous to standard streams. On these operating systems, graphical applications can provide functionality through a system-wide menu that operates on the current [[wikt:selection|selection]] in the GUI, no matter in what application. |
||
Line 225: | Line 216: | ||
* [[C file input/output]] |
* [[C file input/output]] |
||
* [[SYSIN]] and [[SYSOUT]] |
* [[SYSIN]] and [[SYSOUT]] |
||
* [[ |
* [[Files-11#Logical_names|Standard streams in the Files-11 file system]] |
||
==References== |
==References== |
||
Line 235: | Line 226: | ||
* ''KRONOS 2.1 Reference Manual'', Control Data Corporation, Part Number 60407000, 1974 |
* ''KRONOS 2.1 Reference Manual'', Control Data Corporation, Part Number 60407000, 1974 |
||
* ''NOS Version 1 Applications Programmer's Instant'', Control Data Corporation, Part Number 60436000, 1978 |
* ''NOS Version 1 Applications Programmer's Instant'', Control Data Corporation, Part Number 60436000, 1978 |
||
* [http://www.bitsavers.org/pdf/honeywell/multics/AG90-03_PgmgIntro_Dec81.pdf Level 68 Introduction to Programming on MULTICS], Honeywell Corporation, 1981 |
* [http://www.bitsavers.org/pdf/honeywell/multics/AG90-03_PgmgIntro_Dec81.pdf Level 68 Introduction to Programming on MULTICS] {{Webarchive|url=https://web.archive.org/web/20210225022744/http://www.bitsavers.org/pdf/honeywell/multics/AG90-03_PgmgIntro_Dec81.pdf |date=2021-02-25 }}, Honeywell Corporation, 1981 |
||
* [https://web.archive.org/web/20191009002342/https://pdfs.semanticscholar.org/a8e4/4d068a376c42513a4e10d6a751702710afee.pdf Evolution of the MVS Operating System], IBM Corporation, 1981 |
* [https://web.archive.org/web/20191009002342/https://pdfs.semanticscholar.org/a8e4/4d068a376c42513a4e10d6a751702710afee.pdf Evolution of the MVS Operating System], IBM Corporation, 1981 |
||
* ''Lions' Commentary on UNIX Sixth Edition'', John Lions, {{ISBN|1-57398-013-7}}, 1977 |
* ''Lions' Commentary on UNIX Sixth Edition'', John Lions, {{ISBN|1-57398-013-7}}, 1977 |
||
* [http://msdn2.microsoft.com/en-us/library/system.console.aspx Console Class, .NET Framework Class Library], Microsoft Corporation, 2008 |
* [http://msdn2.microsoft.com/en-us/library/system.console.aspx Console Class, .NET Framework Class Library], Microsoft Corporation, 2008 |
||
{{refend}} |
{{refend}} |
||
Latest revision as of 06:27, 5 January 2025
In computer programming, standard streams are preconnected input and output communication channels[1] between a computer program and its environment when it begins execution. The three input/output (I/O) connections are called standard input (stdin), standard output (stdout) and standard error (stderr). Originally I/O happened via a physically connected system console (input via keyboard, output via monitor), but standard streams abstract this. When a command is executed via an interactive shell, the streams are typically connected to the text terminal on which the shell is running, but can be changed with redirection or a pipeline. More generally, a child process inherits the standard streams of its parent process.
Application
[edit]Users generally know standard streams as input and output channels that handle data coming from an input device, or that write data from the application. The data may be text with any encoding, or binary data. When a program is run as a daemon, its standard error stream is redirected into a log file, typically for error analysis purposes.
Streams may be used to chain applications, meaning that the output stream of one program can be redirected to be the input stream to another application. In many operating systems this is expressed by listing the application names, separated by the vertical bar character, for this reason often called the pipeline character. A well-known example is the use of a pagination application, such as more, providing the user control over the display of the output stream on the display.
Background
[edit]In most operating systems predating Unix, programs had to explicitly connect to the appropriate input and output devices. OS-specific intricacies caused this to be a tedious programming task. On many systems it was necessary to obtain control of environment settings, access a local file table, determine the intended data set, and handle hardware correctly in the case of a punch card reader, magnetic tape drive, disk drive, line printer, card punch, or interactive terminal.
One of Unix's several groundbreaking advances was abstract devices, which removed the need for a program to know or care what kind of devices it was communicating with[citation needed]. Older operating systems forced upon the programmer a record structure and frequently non-orthogonal data semantics and device control. Unix eliminated this complexity with the concept of a data stream: an ordered sequence of data bytes which can be read until the end of file. A program may also write bytes as desired and need not, and cannot easily declare their count or grouping.
Another Unix breakthrough was to automatically associate input and output to terminal keyboard and terminal display, respectively, by default[citation needed] — the program (and programmer) did absolutely nothing to establish input and output for a typical input-process-output program (unless it chose a different paradigm). In contrast, previous operating systems usually required some—often complex—job control language to establish connections, or the equivalent burden had to be orchestrated by the program.[citation needed]
Since Unix provided standard streams, the Unix C runtime environment was obliged to support it as well. As a result, most C runtime environments (and C's descendants), regardless of the operating system, provide equivalent functionality.
Standard input (stdin)
[edit]Standard input is a stream from which a program reads its input data. The program requests data transfers by use of the read operation. Not all programs require stream input. For example, the dir and ls programs (which display file names contained in a directory) may take command-line arguments, but perform their operations without any stream data input.
Unless redirected, standard input is inherited from the parent process. In the case of an interactive shell, that is usually associated with the input device of a terminal (or pseudo terminal) which is ultimately linked to a user's keyboard.
On POSIX systems, the file descriptor for standard input is 0 (zero); the POSIX <unistd.h>
definition is STDIN_FILENO
; the corresponding C <stdio.h>
abstraction is provided via the FILE* stdin
global variable. Similarly, the global C++ std::cin
variable of type <iostream>
provides an abstraction via C++ streams. Similar abstractions exist in the standard I/O libraries of practically every programming language.
Standard output (stdout)
[edit]Standard output is a stream to which a program writes its output data. The program requests data transfer with the write operation. Not all programs generate output. For example, the file rename command (variously called mv, move, or ren) is silent on success.
Unless redirected, standard output is inherited from the parent process. In the case of an interactive shell, that is usually the text terminal which initiated the program.
The file descriptor for standard output is 1 (one); the POSIX <unistd.h>
definition is STDOUT_FILENO
; the corresponding C <stdio.h>
variable is FILE* stdout
; similarly, the C++ <iostream>
variable is std::cout
.
Standard error (stderr)
[edit]Standard error is another output stream typically used by programs to output error messages or diagnostics. It is a stream independent of standard output and can be redirected separately.
This solves the semi-predicate problem, allowing output and errors to be distinguished, and is analogous to a function returning a pair of values – see Semipredicate problem § Multivalued return. The usual destination is the text terminal which started the program to provide the best chance of being seen even if standard output is redirected (so not readily observed). For example, output of a program in a pipeline is redirected to input of the next program or a text file, but errors from each program still go directly to the text terminal so they can be reviewed by the user in real time.[2]
It is acceptable and normal to direct standard output and standard error to the same destination, such as the text terminal. Messages appear in the same order as the program writes them, unless buffering is involved. For example, in common situations the standard error stream is unbuffered but the standard output stream is line-buffered; in this case, text written to standard error later may appear on the terminal earlier, if the standard output stream buffer is not yet full.
The file descriptor for standard error is defined by POSIX as 2 (two); the <unistd.h> header file provides the symbol STDERR_FILENO
;[3] the corresponding C <stdio.h>
variable is FILE* stderr
. The C++ <iostream>
standard header provides two variables associated with this stream: std::cerr
and std::clog
, the former being unbuffered and the latter using the same buffering mechanism as all other C++ streams.
Bourne-style shells allow standard error to be redirected to the same destination that standard output is directed to using
2>&1
csh-style shells allow standard error to be redirected to the same destination that standard output is directed to using
>&
Standard error was added to Unix in the 1970s after several wasted phototypesetting runs ended with error messages being typeset instead of displayed on the user's terminal.[4]
Timeline
[edit]1950s: Fortran
[edit]Fortran has the equivalent of Unix file descriptors: By convention, many Fortran implementations use unit numbers UNIT=5
for stdin, UNIT=6
for stdout and UNIT=0
for stderr. In Fortran-2003, the intrinsic ISO_FORTRAN_ENV
module was standardized to include the named constants INPUT_UNIT
, OUTPUT_UNIT
, and ERROR_UNIT
to portably specify the unit numbers.
! FORTRAN 77 example
PROGRAM MAIN
INTEGER NUMBER
READ(UNIT=5,*) NUMBER
WRITE(UNIT=6,'(A,I3)') ' NUMBER IS: ',NUMBER
END
! Fortran 2003 example
program main
use iso_fortran_env
implicit none
integer :: number
read (unit=INPUT_UNIT,*) number
write (unit=OUTPUT_UNIT,'(a,i3)') 'Number is: ', number
end program
1960: ALGOL 60
[edit]ALGOL 60 was criticized for having no standard file access.[citation needed]
1968: ALGOL 68
[edit]ALGOL 68's input and output facilities were collectively referred to as the transput.[5] Koster coordinated the definition of the transput standard. The model included three standard channels: stand in
, stand out
, and stand back
.
# ALGOL 68 example #
main:(
REAL number;
getf(stand in,($g$,number));
printf(($"Number is: "g(6,4)"OR "$,number)); # OR #
putf(stand out,($" Number is: "g(6,4)"!"$,number));
newline(stand out)
)
| |
Input: | Output: |
---|---|
3.14159 |
Number is: +3.142 OR Number is: +3.142! |
1970s: C and Unix
[edit]In the C programming language, the standard input, output, and error streams are attached to the existing Unix file descriptors 0, 1 and 2 respectively.[6] In a POSIX environment the <unistd.h> definitions STDIN_FILENO, STDOUT_FILENO or STDERR_FILENO should be used instead rather than magic numbers. File pointers stdin, stdout, and stderr are also provided.
Ken Thompson (designer and implementer of the original Unix operating system) modified sort in Version 5 Unix to accept "-" as representing standard input, which spread to other utilities and became a part of the operating system as a special file in Version 8. Diagnostics were part of standard output through Version 6, after which Dennis M. Ritchie created the concept of standard error.[7]
1995: Java
[edit]In Java, the standard streams are referred to by System.in
(for stdin), System.out
(for stdout), and System.err
(for stderr).[8]
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.println("Number is:" + number);
} catch (Exception e) {
System.err.println("Error:" + e.getMessage());
}
}
2000s: .NET
[edit]In C# and other .NET languages, the standard streams are referred to by System.Console.In
(for stdin), System.Console.Out
(for stdout) and System.Console.Error
(for stderr).[9] Basic read and write capabilities for the stdin and stdout streams are also accessible directly through the class System.Console
(e.g. System.Console.WriteLine()
can be used instead of System.Console.Out.WriteLine()
).
System.Console.In
, System.Console.Out
and System.Console.Error
are System.IO.TextReader
(stdin) and System.IO.TextWriter
(stdout, stderr) objects, which only allow access to the underlying standard streams on a text basis. Full binary access to the standard streams must be performed through the System.IO.Stream
objects returned by System.Console.OpenStandardInput()
, System.Console.OpenStandardOutput()
and System.Console.OpenStandardError()
respectively.
// C# example
public static int Main(string[] args)
{
try {
string s = System.Console.In.ReadLine();
double number = double.Parse(s);
System.Console.Out.WriteLine("Number is: {0:F3}", number);
return 0;
// If Parse() threw an exception
} catch (ArgumentNullException) {
System.Console.Error.WriteLine("No number was entered!");
} catch (FormatException) {
System.Console.Error.WriteLine("The specified value is not a valid number!");
} catch (OverflowException) {
System.Console.Error.WriteLine("The specified number is too big!");
}
return -1;
}
' Visual Basic .NET example
Public Function Main() As Integer
Try
Dim s As String = System.Console.[In].ReadLine()
Dim number As Double = Double.Parse(s)
System.Console.Out.WriteLine("Number is: {0:F3}", number)
Return 0
' If Parse() threw an exception
Catch ex As System.ArgumentNullException
System.Console.[Error].WriteLine("No number was entered!")
Catch ex2 As System.FormatException
System.Console.[Error].WriteLine("The specified value is not a valid number!")
Catch ex3 As System.OverflowException
System.Console.[Error].WriteLine("The specified number is too big!")
End Try
Return -1
End Function
When applying the System.Diagnostics.Process
class one can use the instance properties StandardInput
, StandardOutput
, and StandardError
of that class to access the standard streams of the process.
2000 - : Python (2 or 3)
[edit]The following example, written in Python, shows how to redirect the standard input both to the standard output and to a text file.
#!/usr/bin/env python
import sys
# Save the current stdout so that we can revert sys.stdout
# after we complete our redirection
stdin_fileno = sys.stdin
stdout_fileno = sys.stdout
# Redirect sys.stdout to the file
sys.stdout = open("myfile.txt", "w")
ctr = 0
for inps in stdin_fileno:
ctrs = str(ctr)
# Prints to the redirected stdout ()
sys.stdout.write(ctrs + ") this is to the redirected --->" + inps + "\n")
# Prints to the actual saved stdout handler
stdout_fileno.write(ctrs + ") this is to the actual --->" + inps + "\n")
ctr = ctr + 1
# Close the file
sys.stdout.close()
# Restore sys.stdout to our old saved file handler
sys.stdout = stdout_fileno
GUIs
[edit]Graphical user interfaces (GUIs) do not always make use of the standard streams; they do when GUIs are wrappers of underlying scripts and/or console programs, for instance the Synaptic package manager GUI, which wraps apt commands in Debian and/or Ubuntu. GUIs created with scripting tools like Zenity and KDialog by KDE project[10] make use of stdin, stdout, and stderr, and are based on simple scripts rather than a complete GUI programmed and compiled in C/C++ using Qt, GTK, or other equivalent proprietary widget framework.
The Services menu, as implemented on NeXTSTEP and Mac OS X, is also analogous to standard streams. On these operating systems, graphical applications can provide functionality through a system-wide menu that operates on the current selection in the GUI, no matter in what application.
Some GUI programs, primarily on Unix, still write debug information to standard error. Others (such as many Unix media players) may read files from standard input. Popular Windows programs that open a separate console window in addition to their GUI windows are the emulators pSX and DOSBox.
GTK-server can use stdin as a communication interface with an interpreted program to realize a GUI.
The Common Lisp Interface Manager paradigm "presents" GUI elements sent to an extended output stream.
See also
[edit]- Redirection (computing)
- Stream (computing)
- Input/output
- C file input/output
- SYSIN and SYSOUT
- Standard streams in the Files-11 file system
References
[edit]- ^ D. M. Ritchie, "A Stream Input-Output System", AT&T Bell Laboratories Technical Journal, 68(8), October 1984.
- ^ "What are stdin, stdout and stderr in Linux? | CodePre.com". 2 December 2021. Retrieved 8 April 2022.
- ^ "<unistd.h>". The Open Group Base Specifications Issue 6—IEEE Std 1003.1, 2004 Edition. The Open Group. 2004.
- ^ Johnson, Steve (2013-12-11). "[TUHS] Graphic Systems C/A/T phototypesetter" (Mailing list). Archived from the original on 2020-09-25. Retrieved 2020-11-07.
- ^ "Revised Report on the Algorithmic Language Algol 68", edited by A. van Wijngaarden, B.J. Mailloux, J.E.L. Peck, C.H.A. Koster, M. Sintzoff, C.H. Lindsey, L.G.L.T. Meertens and R.G. Fisker, Section 10.3.
- ^ "Stdin(3): Standard I/O streams - Linux man page". die.net. Archived from the original on Jun 8, 2023.
- ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139. Archived (PDF) from the original on Dec 15, 2023.
- ^ "System (Java Platform SE 7)". Oracle Help Center. Retrieved 20 July 2012.
- ^ ".NET Framework 4.7.1, mscorlib, console.cs". Reference Source - Microsoft. Archived from the original on Dec 10, 2017. Retrieved 2017-12-10.
- ^ Kißling, Kristian (2009). "Adding graphic elements to your scripts with Zenity and KDialog". Linux Magazine. Retrieved 2021-04-11.
Sources
[edit]- "Standard Streams", The GNU C Library
- KRONOS 2.1 Reference Manual, Control Data Corporation, Part Number 60407000, 1974
- NOS Version 1 Applications Programmer's Instant, Control Data Corporation, Part Number 60436000, 1978
- Level 68 Introduction to Programming on MULTICS Archived 2021-02-25 at the Wayback Machine, Honeywell Corporation, 1981
- Evolution of the MVS Operating System, IBM Corporation, 1981
- Lions' Commentary on UNIX Sixth Edition, John Lions, ISBN 1-57398-013-7, 1977
- Console Class, .NET Framework Class Library, Microsoft Corporation, 2008
External links
[edit]- Standard Input Definition - by The Linux Information Project
- Standard Output Definition - by The Linux Information Project
- Standard Error Definition - by The Linux Information Project