STDIN - Linux手册页

时间:2019-08-20 18:01:22  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2017-09-15

名称

stdin, stdout, stderr -标准I / O流 标准输入,标准输出,标准错误

语法

#include <stdio.h>

extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;

说明

在正常情况下,每个UNIX程序在启动时都会为其打开三个流,一个流用于输入,一个用于输出,以及一个用于打印诊断或错误消息。这些通常连接到用户终端(请参阅tty(4)),但可能会引用文件或其他设备,具体取决于父进程选择设置的内容。 (另请参见sh(1)的"重定向"部分。)

输入流称为"标准输入";输出流称为"标准输出";错误流称为"标准错误"。这些术语被缩写以形成用于引用这些文件的符号,即stdin,stdout和stderr。

这些符号中的每一个都是指向FILE的类型指针的stdio(3)宏,并且可以与fprintf(3)或fread(3)之类的函数一起使用。

由于FILE是UNIX文件描述符的缓冲包装器,因此也可以使用原始UNIX文件接口(即类似read(2)和lseek(2)的函数)访问相同的基础文件。

在程序启动时,与流stdin,stdout和stderr关联的整数文件描述符分别为0、1和2。预处理器符号STDIN_FILENO,STDOUT_FILENO和STDERR_FILENO在中用这些值定义。 (将freopen(3)应用于这些流之一可以更改与该流关联的文件描述符号。)

请注意,将FILE和原始文件描述符混合使用会产生意想不到的结果,通常应避免使用。 (针对您之间的自虐狂:POSIX.1,第8.2.3节详细描述了这种交互作用的原理。)一个通用规则是,文件描述符在内核中处理,而stdio只是一个库。例如,这意味着在exec(3)之后,子级继承所有打开的文件描述符,但是所有旧流都变得不可访问。

由于符号stdin,stdout和stderr被指定为宏,因此分配给它们是不可移植的。借助引入的库函数freopen(3),可以使标准流引用不同的文件,该函数专门用于重新分配stdin,stdout和stderr。通过调用exit(3)和正常程序终止来关闭标准流。

遵循规范

stdin,stdout和stderr宏符合C89,并且该标准还规定这三个流应在程序启动时打开。

备注

流stderr是无缓冲的。流stdout指向终端时是行缓冲的。在调用fflush(3)或exit(3)或打印换行符之前,不会出现分行。这会产生意想不到的结果,尤其是在调试输出的情况下。可以使用setbuf(3)或setvbuf(3)调用来更改标准流(或任何其他流)的缓冲模式。请注意,如果stdin与终端相关联,则在终端驱动程序中可能还会存在与stdio缓冲完全无关的输入缓冲。 (实际上,通常终端输入在内核中是行缓冲的。)可以使用tcsetattr(3)之类的调用来修改此内核输入处理。另请参见stty(1)和termios(3)。

另外参见

csh(1),sh(1),open(2),fopen(3),stdio(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/