根据这个答案、stdin
、stdout
、 和stderr
最初都连接到同一个地方(与 相同),并且读取和写入 和的/dev/tty
约定仅是:约定。stdin
stdout
stderr
既然如此,为什么要将stdin
它们分开stdout
,而不是将它们合并为一个呢?
答案1
FILE 指针(例如 stdin、stdout 和 stderr)只能包含一个底层文件描述符。因此,如果您有如下管道设置:
ls | grep foo | less
那么 grep 的 stdin、stdout 和 stderr 都有不同的 fileno(),因为有两个连接的 pipeline()。因此也必须有不同的文件。
答案2
将输入流与输出流分开使程序可以更轻松地在读取输入的同时写入其输出。
它使得允许程序使用重定向或管道将其输出写入其他地方而不是其输入来源变得更加容易。
另外,除了是只是一个约定,三个标准 I/O 流也是标准。参见例如标准 I/O 流部分POSIX 标准的系统接口部分。
该部分的基本原理说:
尽管 ISO C 标准保证在程序启动时,stdin 可供读取,stdout 和 stderr 可供写入,但这种保证取决于程序正在运行的情况(ISO C 和 POSIX 标准做出的所有保证也是如此)。在符合要求的环境中执行。使用未打开进行读取的文件描述符 0 或未打开进行写入的文件描述符 1 或 2 执行的程序将在不符合要求的环境中执行。应用程序编写者被警告不要执行标准实用程序或符合文件描述符 0 未打开读取或文件描述符 1 或 2 未打开写入的应用程序。