为什么stdin和stdout看起来可以互换?
我知道stdin和stdout(至少在UNIX的说法中)是流缓冲区,并且stdout用于从程序输出到控制台(或者由shell等管道),并且该stdin用于标准输入到一个程序..
那么为什么它至少在macOS上可以互换使用(标准输出为stdin,反之亦然?
例子:
如果你运行cat /dev/stdin
然后输入一些东西,它会回应它。 像cat /dev/stdout
一样运行命令也是一样。
同样, echo "Hey There" > /dev/stdout
和echo "Hey There" > /dev/stdin
都输出'Hey There'回到终端。
它也适用于C ++:
例:
#include <iostream>
#include <string>
#include <fstream>
int main(int argc, const char * argv[]) {
std::string echoString;
std::fstream stdoutFile;
stdoutFile.open("/dev/stdout");
stdoutFile << "Hey look! I'm using stdout properly!nNow You trying using it wrongly: " << std::endl;
stdoutFile >> echoString;
stdoutFile << "You Typed: " << echoString << std::endl;
}
出现提示时,键入一个单词,然后按EOF(Ctrl + D)按预期工作。
因为通常情况下,当从交互式终端调用程序时,无重定向时,标准输入和标准输出都会连接到相同的终端设备,例如/dev/tty
(实际设备名称因操作系统而异) 。
终端设备是一个读/写设备。 从终端设备读取终端输入。 写入终端设备会在终端上生成输出。
你仍然有独立的文件描述符,0和1,但它们连接到同一个设备。
把它看作单一的双向管道,它被dup
到文件描述符0和1。
Linux的行为方式相同(您可以echo Foo >/dev/stdin
并查看输出):
$ ls -al /proc/self/fd/[01]
lrwx------. 1 mrsam mrsam 64 Nov 22 21:34 /proc/self/fd/0 -> /dev/pts/1
lrwx------. 1 mrsam mrsam 64 Nov 22 21:34 /proc/self/fd/1 -> /dev/pts/1
因此,对于这个过程,文件描述符0和1连接到/dev/pts/1
,即相同的伪终端设备。 无论您是从文件描述符0还是文件描述符1读取,您最终都会从相同的底层/dev
设备读取数据,因此您使用的实际文件描述符的大小没有区别。
这当然取决于操作系统。 其他基于POSIX的操作系统可以通过其他方式实现其标准输入和输出,其中您不能实际写入标准输入并从标准输出读取。
正如你所说,他们只是流缓冲区。 没有任何关于他们强制执行特定的使用模式 - 只是惯例。 流缓冲区stdin,stdout和stderr都是为编程提供便利。
链接地址: http://www.djcxy.com/p/37229.html