代码之家  ›  专栏  ›  技术社区  ›  Shouvik

对stdin,stdout和stderr感到困惑吗?

  •  166
  • Shouvik  · 技术社区  · 14 年前

    我对这三份文件的目的感到困惑。如果我的理解是正确的, stdin 是一个文件,程序在该文件中写入请求以运行进程中的任务, stdout stderr 输入所有异常的文件。在打开这些文件检查是否真的发生了这些,我发现似乎没有什么建议这样!

    我想知道的是,这些文件的目的到底是什么,用很少的技术术语来回答这个问题!

    10 回复  |  直到 6 年前
        1
  •  276
  •   paxdiablo    4 年前

    -这就是 文件句柄 你的进程读取以从你那里获取信息。

    标准输出 -您的进程将常规输出写入此文件句柄。

    -进程将诊断输出写入此文件句柄。

    这是我能做的最简单的事情:-)

    当您的进程启动时,它应该已经打开了这些句柄,并且可以对它们进行读取和/或写入。

    默认情况下,它们可能连接到您的终端设备(例如。, /dev/tty )但是shell允许您在进程开始之前在这些句柄和特定文件和/或设备(甚至到其他进程的管道)之间建立连接(一些可能的操作相当聪明)。

    例如:

    my_prog <inputfile 2>errorfile | grep XYZ
    

    • 为创建流程 my_prog .
    • 打开 inputfile 作为标准输入(文件句柄0)。
    • errorfile 作为标准错误(文件句柄2)。
    • 创造 另一个 过程 grep
    • 我的程序 格雷普 .

    当我在/dev文件夹中打开这些文件时,为什么我永远看不到进程运行的输出?

    因为它们不是普通的文件。当UNIX呈现 一切 作为某个文件系统中的一个文件,这并不意味着它处于最低级别。中的大多数文件 /dev

    当您打开它们时,您连接到的是设备驱动程序而不是物理文件,并且设备驱动程序足够聪明,知道应该单独处理单独的进程。

    /proc 文件系统。这些不是真正的文件,只是严格控制的内核信息网关。

        2
  •  69
  •   Jim Lewis    14 年前

    这样说更为正确 stdin , stdout stderr 是“I/O流”而不是 而不是文件。正如您所注意到的,这些实体并不存在于文件系统中。但是 就I/O而言,Unix的理念是“一切都是一个文件”。实际上, 这意味着您可以使用相同的库函数和接口( printf , scanf read write , select 连接到键盘、磁盘文件、套接字、管道或其他一些I/O抽象。

    大多数程序需要读取输入、写入输出和记录错误,所以 标准 , 标准 标准错误 是为您预定义的,以方便编程。这只是

        3
  •  59
  •   Anthony Smith galeop    4 年前

    作为上述答案的补充,以下是关于重定向的总结: Redirections cheatsheet

    第一个示例根本不使用stdin,而是将“hello”作为参数传递给echo命令。

    图中还显示2>&1与&具有相同的效果&燃气轮机;然而

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

        4
  •  26
  •   sarnold    14 年前

    恐怕你的理解完全颠倒了

    从这个角度考虑“标准输入”、“标准输出”和“标准误差” 程序的

    当程序需要打印输出时,它通常打印到“标准输出”。程序通常打印输出到标准输出 printf ,只打印到标准输出。

    fprintf ,它接受打印时使用的文件流。文件流可以是为写入而打开的任何文件:标准输出、标准错误或任何其他已使用打开的文件 fopen fdopen .

    当文件需要读取输入时,使用“standard in” fread fgets ,或 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
    

    或者,整个enchilada:

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

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

    其次,我给出了处理文件流的标准isoc函数( FILE * int read write ,它不能很好地缓冲isoc函数。我想保持它的简单性,使用更简单的函数,但我仍然认为您应该知道其他选项。:)

        5
  •  12
  •   galeop    6 年前

    标准

    在C中与scanf一起使用

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

    标准

    向控制台生成输出。 在C中与printf一起使用

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

    标准错误

    产生“错误”输出到控制台。

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

    可以重定向stdin的源。例如,它可以来自文件,而不是来自键盘输入( echo < file.txt ),或其他程序( ps | grep <userid> ).

    ls . > ls-output.txt ,在这种情况下,输出将写入文件 ls-output.txt . Stderr can be redirected 具有 2>

        6
  •  10
  •   dee    3 年前

    我想人们会说 stderr 应仅用于错误消息具有误导性。

    它还应用于为运行命令的用户而不是为数据的任何潜在下游使用者提供信息的消息(即,如果运行一个shell管道链接多个命令,则不希望出现“获取424的第30项”之类的信息消息) stdout

    看到了吗 this

    “所有程序都将诊断置于标准输出上。这有 当输出被重定向到le时总是引起麻烦,但是 过程。尽管如此,不愿意违背 标准投入标准产出模式,人们容忍这种状态 通过v6处理事务。不久之后,丹尼斯·里奇切断了戈尔迪安 有了管道,诊断可以来自几个程序中的任何一个 同时运行。诊断需要自我识别。”

        7
  •  4
  •   Margach Chris    6 年前

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

    $ man stdout 
    

    标准 一条小溪流出来

    标准 对于流输入

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

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

        8
  •  3
  •   Sam    10 年前

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


    /proc/(pid)/fd/1-标准输入文件

    例如 my terminal window

    但只有在/bin/bash中工作得这么好其他进程通常在0中没有任何内容,但许多进程在2中编写了错误

        9
  •  2
  •   geekanil    6 年前

    stderr不会进行IO缓存缓冲,因此如果我们的应用程序需要将关键消息信息(一些错误、异常)打印到控制台或文件中,那么使用stdout打印常规日志信息就像使用IO缓存缓冲一样,在将消息写入文件之前,应用程序可能会关闭,从而导致调试复杂

        10
  •  0
  •   Bahruz Balabayov    7 年前

    具有相关缓冲区的文件称为流,并声明为指向已定义类型文件的指针。函数的作用是:为一个流创建特定的描述性数据,并返回一个指针来指定所有后续事务中的流。通常有三个开放的流,它们的头中声明了常量指针,并与标准的开放文件相关联。

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

        11
  •  0
  •   WinEunuuchs2Unix    4 年前

    这是一篇关于 stdin , stdout stderr :

    总结一下:

    流就像文件一样处理

    它们是文件。可以从文件中读取文本,也可以编写文本 将数据流作为一个文件来处理的概念并没有那么复杂

    与进程相关联的每个文件都被分配一个唯一的编号 确认一下。这称为文件描述符。每当一个动作 识别文件。

    这些值始终用于stdin、stdout和stderr:

    0: stdin
    1: stdout
    2: stderr
    

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