我对这三个文件的用途感到相当困惑。如果我的理解是正确的,stdin是程序写入它的请求以在进程中运行任务的文件,stdout是内核写入它的输出和它访问的请求进程的信息的文件,stderr是所有异常都输入的文件。在打开这些文件来检查这些是否真的发生了,我发现似乎没有什么建议!

我想知道的是这些文件的确切目的是什么,绝对愚蠢的答案与很少的技术术语!


当前回答

A file with associated buffering is called a stream and is declared to be a pointer to a defined type FILE. The fopen() 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 header and associated with the standard open files. At program startup three streams are predefined and need not be opened explicitly: standard input (for reading conventional input), standard output (for writing conventional output), and standard error (for writing diagnostic output). When opened the standard error stream is not fully buffered; the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device

https://www.mkssoftware.com/docs/man5/stdio.5.asp

其他回答

我认为人们说stderr应该只用于错误消息是一种误导。

它还应该用于为运行命令的用户而不是数据的任何潜在下游消费者提供的信息性消息(例如,如果您运行一个连接多个命令的shell管道,您不希望像“获取42424的item 30”这样的信息性消息出现在stdout上,因为它们会混淆消费者,但您可能仍然希望用户看到它们。

看看下面的历史逻辑:

"All programs placed diagnostics on the standard output. This had always caused trouble when the output was redirected into a file, but became intolerable when the output was sent to an unsuspecting process. Nevertheless, unwilling to violate the simplicity of the standard-input-standard-output model, people tolerated this state of affairs through v6. Shortly thereafter Dennis Ritchie cut the Gordian knot by introducing the standard error file. That was not quite enough. With pipelines diagnostics could come from any of several programs running simultaneously. Diagnostics needed to identify themselves."

使用ps -aux显示当前进程,所有这些进程都列在/proc/ as /proc/(pid)/中,通过调用cat /proc/(pid)/fd/0,它会打印在该进程的标准输出中找到的任何东西。因此,或许,

/proc/(pid)/fd/0 -标准输出文件 /proc/(pid)/fd/1 -标准输入文件 /proc/(pid)/fd/2 -标准错误文件

例如

但只有在/bin/bash中才能很好地工作,其他进程通常在0中没有任何内容,但在2中有许多错误

下面是一篇关于stdin, stdout和stderr的长篇文章:

Linux中的stdin、stdout和stderr是什么?

总结:

Streams Are Handled Like Files Streams in Linux—like almost everything else—are treated as though they were files. You can read text from a file, and you can write text into a file. Both of these actions involve a stream of data. So the concept of handling a stream of data as a file isn’t that much of a stretch. Each file associated with a process is allocated a unique number to identify it. This is known as the file descriptor. Whenever an action is required to be performed on a file, the file descriptor is used to identify the file. These values are always used for stdin, stdout, and stderr: 0: stdin 1: stdout 2: stderr

具有讽刺意味的是,我在堆栈溢出和上面的文章中发现了这个问题,因为我正在搜索关于异常/非标准流的信息。所以我的探索还在继续。

恐怕你的理解完全落后了。:)

从程序的角度考虑“标准输入”、“标准输出”和“标准错误”,而不是从内核的角度考虑。

当一个程序需要打印输出时,它通常会打印到“标准输出”。程序通常使用printf将输出输出打印到标准输出,printf仅打印到标准输出。

当程序需要打印错误信息时(不一定是异常,那些是编程语言的结构,在更高的级别上强加),它通常打印为“标准错误”。它通常使用fprintf来实现,fprintf接受打印时使用的文件流。文件流可以是任何打开用于写入的文件:标准输出、标准错误或任何其他已使用fopen或fdopen打开的文件。

当文件需要读取输入时,使用"standard in",使用fread或fgets或getchar。

这些文件中的任何一个都可以很容易地从shell重定向,就像这样:

cat /etc/passwd > /tmp/out     # redirect cat's standard out to /tmp/foo
cat /nonexistant 2> /tmp/err   # redirect cat's standard error to /tmp/error
cat < /etc/passwd              # redirect cat's standard input to /etc/passwd

或者,整个玉米卷饼:

cat < /etc/passwd > /tmp/out 2> /tmp/err

这里有两个重要的警告:首先,“标准输入”、“标准输出”和“标准错误”只是一种约定。它们是一个非常强大的约定,但它只是一个协议,能够运行这样的程序是非常好的:grep echo /etc/services | awk '{print $2;}' | sort,并将每个程序的标准输出连接到管道中下一个程序的标准输入。

其次,我给出了用于处理文件流(file *对象)的标准ISO C函数——在内核级别,它是所有的文件描述符(文件表的int引用)和更低级的操作,如读和写,它们不像ISO C函数那样进行愉快的缓冲。我想保持简单,使用更简单的函数,但我认为你仍然应该知道替代方案。:)

有关这些文件的权威信息,请查看手册页,在您的终端上运行该命令。

$ man stdout 

但简单来说,每个文件都是用于:

输出流的Stdout

流输入的Stdin

打印错误或日志消息的标准错误。

每个unix程序都有这些流中的每一个。