table of contents
        
      
      
    | STDIN(3) | Library Functions Manual | STDIN(3) | 
NAME¶
stdin, stdout,
    stderr — 标准
    I/O 流
SYNOPSIS 总览¶
#include <stdio.h>
    extern FILE *stdin; extern FILE
    *stdout; extern FILE *stderr;
DESCRIPTION 描述¶
通常,每个 Unix 程序在启动时都会打开三个流,一个用于输入,一个用于输出,一个用于打印诊断或错误消息。典型的,他们被连接到用户的终端 (参见 tty(4)) 但是也有可能指向文件或是其他设备,取决于父进程选择设置了什么 (参见 sh(1) 的重定向 (``Redirection'') 章节。)
输入流被称为 ``standard
    input''; 输出流被称为 ``standard
    output''; 错误流被称为 ``standard
    error''。这些名词通常简写为符号,用于引用这些文件,它们是
    stdin, stdout, 和
    stderr.
这些符号中,每一个都是 stdio(3) 中的一个宏,类型是指向 FILE 的指针,可以用于类似 fprintf(3) 或 fread(3) 等函数中。
由于 FILE 是一个对 Unix
    文件描述符加以缓冲的包装,下层的文件也可以使用原始的
    Unix
    文件接口来存取。也就是,类似
    read(2) 和 lseek(2)
    的函数。与流
    stdin, stdout, 和
    stderr
    关联的整数形式的文件描述符分别是
    0,1 还有
    2。预处理器符号
    STDIN_FILENO,STDOUT_FILENO 和 STDERR_FILENO
    分别以它们为值,定义在
    <unistd.h> 中。
注意混合使用 FILE 和原始的文件描述符可能带来不可预料的结果,一般应当避免。(对于喜欢追根问底的人:POSIX.1 规范的 8.2.3 节详细地描述了这样的混合使用怎样才能不出错。) 一个简单的规则是,文件描述符由内核控制,而 stdio 仅仅是一个库。它的意思是,例如当调用 exec 之后,子进程可以继承所有打开的文件描述符,但是任何原有的流都不可再存取了。
由于符号 stdin,
    stdout, 和 stderr
    被指定为宏,为它们赋值将导致不可移植。利用库函数
    freopen(3)
    ,标准流可以用来指向不同的文件。引进这个函数专门用来为
    stdin, stdout, 和
    stderr
    重新赋值。标准流在调用
    exit(3)
    和程序正常中止时被关闭。
SEE ALSO 参见¶
CONSIDERATIONS¶
错误流 stderr
    是非缓冲的。输出流
    stdout
    是行缓冲的,如果它指向一个终端。不完全的行只有在调用
    fflush(3) 或 exit(3)
    ,或者打印了新行符之后才会显示。这样可能带来无法预料的结果,尤其是调试输出时。标准流
    (或任何其他流)
    的缓冲模式可以用函数
    setbuf(3) 或 setvbuf(3)
    来切换。注意当
    stdin
    与一个终端关联时,也许终端驱动中存在输入缓冲,与
    stdio
    缓冲完全无关。(确实如此,一般的终端输入在内核中是行缓冲的。)
    内核对输入的控制可以通过对
    tcsetattr(3)
    的调用来修改,参见
    stty(1), 和 termios(3)
  。
CONFORMING TO 标准参考¶
宏 stdin,
    stdout, 和 stderr
    遵循 ANSI X3.159-1989
    (“ANSI C89”)
    标准,这个标准同时规定了这三个流应当在程序启动时打开。
| March 24, 1998 | Linux 2.0 |