Linux/Unix 中是否存在“非标准”流?

Linux/Unix 中是否存在“非标准”流?

Linux中所谓的“标准流”是stdin、stdout和stderr。它们必须被称为“标准”是有原因的。是否存在非标准流?内核是否从根本上区别对待那些非标准流?

答案1

在这种情况下,“流”是进程中打开的文件。 (“流”一词可能有其他与本文无关的含义。)

这三个标准流是在程序启动时应该已经打开的流。文件描述符 0 称为标准输入,因为程序应该在此处读取用户输入或其默认数据输入。文件描述符 1 称为标准输出,因为程序应该在其中写入其正常数据输出。文件描述符 2 称为标准错误,因为程序应该在其中写入错误消息。

其他文件描述符编号不是标准的,因为它们没有这样的预先分配的角色。它们最终将被用于程序想要的任何用途。因此,可以将程序打开的任何文件称为“非标准流”,但这会很奇怪且令人困惑:“打开 stdin、stdout 或 stderr 之外的文件”实际上不需要名称,而“非标准流”听起来像是某些特殊类型的文件或通过非标准方法打开的文件,情况并非如此。

文件描述符 0-2 的常规角色是由标准库和某些程序授予的。例如,控制台登录程序和终端仿真器启动 shell(或其他程序),并在这些文件描述符上打开终端。 C 标准库FILE*为这三个标准描述符创建对象(C 称之为流)。内核中没有特殊处理。

答案2

内核以相同的方式处理所有文件描述符。进程使用文件描述符 0 作为输入 (stdin)、文件描述符 1 作为输出 (stdout)、并在文件描述符 2 (stderr) 上打印错误只是一种约定。

当你的终端启动时,它会创建一个伪 tty 并启动一个 shell,其中输入/输出分配给文件描述符 0、1 和 2。然后,如果你的程序不使用此约定,则必须适当地重定向输入和/或输出。

相关内容