感到困惑的标准输入,输出和错误?感到困惑的标准输入,输出和错误?(Confused about st

2019-05-11 01:11发布

我感到相当困惑与这三个文件的目的。 如果我的理解是正确的, stdin是其中一个程序写入到其请求运行的过程中任务的文件, stdout是到其中的内核将其输出,并要求其访问从信息化进程的文件, stderr是输入到这所有的异常文件。 在打开这些文件,以检查是否这些实际上确实发生,我什么也没有发现似乎说明这样的!

我想知道的是,究竟是这些文件的目的,绝对简单化的回答很少专业术语!

Answer 1:

标准输入 -这是文件句柄 ,你的进程读取从你得到的信息。

标准输出 -你的进程写入正常信息,这个文件句柄。

标准的错误 -你的进程写入错误信息到这个文件句柄。

这是我们所简单化向下的,因为我可以把它:-)

当然,按照惯例的居多。 没有什么东西写你的错误信息到标准输出,如果你想阻止你。 你甚至可以关闭三个文件句柄完全打开自己的文件I / O。

当你的进程启动时,它应该已经具有这些把手张开,它可以仅从读取和/或写信给他们。

默认情况下,他们很可能连接到您的终端设备(例如, /dev/tty ),但炮弹可以让你的过程之前设置这些句柄和特定的文件和/或设备(甚至管道给其他进程)之间的连接开始(一些可能的操作是相当聪明)。

一个例子是:

my_prog <inputfile 2>errorfile | grep XYZ

这将:

  • 创建一个过程my_prog
  • 打开inputfile作为标准输入(文件句柄0)。
  • 打开errorfile作为你的标准错误(文件句柄2)。
  • 创建另一个进程grep
  • 的标准输出连接my_prog到的标准输入grep

回复您的评论:

当我在/ dev目录文件夹中打开这些文件,为什么我从来没有看到一个进程运行的输出?

这是因为他们是不正常的文件。 虽然UNIX呈现的一切 ,在一个地方文件系统中的文件,不让它那么在最低水平。 在大多数文件/dev层次结构或者是字符或块装置,有效的设备驱动器。 他们没有一大小,但他们有一个主要和次要设备编号。

当你打开他们,你连接到设备驱动程序,而不是一个物理文件,设备驱动程序是足够聪明,知道单独的进程中,应分开处理。

同样是真实为Linux /proc文件系统。 这些都不是真正的文件,只要严格控制网关内核信息。



Answer 2:

这将是更正确地说, stdinstdoutstderr是“I / O流”,而不是文件。 正如你已经注意到,这些实体不住在文件系统中。 但Unix哲学,就I / O而言,是“一切皆文件”。 在实践中,真正意味着你可以使用相同的库功能和接口( printfscanfreadwriteselect等),而不必担心I / O流是否连接到键盘,磁盘文件,插座,管道,或一些其他I / O抽象。

大多数程序需要读取输入,输出写入,并记录错误,所以stdinstdoutstderr都为您预定义,为编程方便。 这仅仅是一个约定,而不是由操作系统执行。



Answer 3:

如上答案的补充,这里是一个总结关于重定向:

编辑:该图形是不完全正确的,但我不知道为什么...

该图形表示,2>&1具有作为然而&>同样的效果

ls Documents ABC > dirlist 2>&1
#does not give the same output as 
ls Documents ABC > dirlist &>


Answer 4:

我怕你的理解是完全反了。 :)

认为“标准”,“标准输出”和“标准错误”从程序的角度,而不是从内核的角度来看的。

当程序需要打印输出,它通常打印为“标准输出”。 一种程序,典型地打印输出到标准输出与printf ,这仅打印到标准输出。

当程序需要打印错误信息(不一定是例外,那是一种编程语言的结构,在更高等级的处罚),通常打印为“标准错误”。 它通常与这样做fprintf ,它接受在打印时使用的文件流。 文件流可能是任意文件打开以写入:标准输出,标准错误,或已打开与任何其他文件fopenfdopen

“标准”用于当文件需要读取输入,使用freadfgets ,或getchar

这些文件可以从外壳很容易地重定向 ,像这样:

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 grep echo /etc/services | awk '{print $2;}' | sort grep echo /etc/services | awk '{print $2;}' | sort ,并具有钩入在流水线中的下一程序的标准输入各节目的标准输出。

其次,我给出的标准ISO C函数与文件流(工作FILE *对象) -在内核级别,它是所有文件描述符( int到文件表引用)和许多低级别的操作,如readwrite ,这不这样做的ISO C函数的快乐缓冲。 我想,以保持它的简单,使用更方便的功能,但我想你应该知道的替代品都相同。 :)



Answer 5:

标准输入

通过控制台(如键盘输入)读取输入。 用于在C与scanf函数

scanf(<formatstring>,<pointer to storage> ...);

标准输出

产生输出到控制台。 用于在C与printf的

printf(<string>, <values to print> ...);

标准错误

产生“错误”输出到控制台。 用于在C与fprintf中

fprintf(stderr, <string>, <values to print> ...);

重定向

对于标准输入源可以被重定向。 例如,而不是从键盘输入来,它可以来自一个文件( echo < file.txt ),或其他程序( ps | grep <userid>

标准输出的目的地,也STDERR可以重定向。 例如标准输出可以被重定向到一个文件: ls . > ls-output.txt ls . > ls-output.txt ,在这种情况下的输出被写入到文件ls-output.txt 。 标准错误可以被重定向以2>



Answer 6:

我认为人们说stderr应该只用于错误信息是具有误导性。

还应该用于那些都是为了运行该命令并没有任何潜在的下游用户数据的用户信息的消息(也就是说,如果你运行一个壳管链接一些命令,你不希望像“获得的第30项信息的消息42424"出现在stdout ,因为它们会迷惑消费者,但你可能还是希望用户看到他们。

见这个历史的理由:

“所有程序置于诊断标准输出上,这一直引起麻烦时,输出被重定向到一个文件,却成了无法忍受当输出被送到不知情的过程。不过,不愿违背的简单标准输入 - 标准输出模式,人们通过V6容忍这种状况。此后不久,丹尼斯·里奇通过引入标准错误连接的文件快刀斩乱麻,这是不太够。随着管道的诊断可能来自任何同时运行几个程序。诊断需要表明自己的身份。”



Answer 7:

用ps -aux揭示了当前进程,所有这些都在/ proc列/ AS / PROC /(PID)/,通过调用执行cat / proc /(PID)/ FD / 0它打印在标准输出发现任何这个过程我想。 因此,也许,

的/ proc /(PID)/ FD / 0 - 标准输出文件
的/ proc /(PID)/ FD / 1 - 标准输入文件
的/ proc /(PID)/ FD / 2 - 标准错误文件

例如

但是,只有工作这口井为/斌/庆典等工序通常是一无所有0,但很多人写在2个错误



Answer 8:

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

$ man stdout 

但是,对于一个简单的答案,每个文件是:

标准输出为流出来

标准输入流输入

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

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



Answer 9:

所以,如果我们的应用程序需要打印重要的消息信息(一些错误,例外)到控制台或文件中使用它在那里为使用标准输出,因为它使用IO缓存缓存有打印一般的日志信息标准错误不会去做IO缓存缓存是一个机会,写我们的消息记录到文件的应用程序可能会关闭,留给调试复杂的前



Answer 10:

具有相关联的缓冲的文件被称为流和被宣布为一个指向一个定义的类型FILE。 则fopen()函数的流创建特定的描述性数据,并返回一个指针在所有的进一步事务来指定流。 通常有在头声明,并与标准打开的文件关联的常量指针三个流。 在程序启动时三个流是预定义的,并且不需要明确地打开:标准输入(用于读取传统的输入),标准输出(用于写入常规输出)和标准误差(用于写入诊断输出)。 当打开时的标准误差流不完全缓冲; 标准输入和标准输出流是完全缓冲当且仅当能够确定流不提及交互设备

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



文章来源: Confused about stdin, stdout and stderr?