为什么stdin和stdout看起来可以互换?

我知道stdin和stdout(至少在UNIX的说法中)是流缓冲区,并且stdout用于从程序输出到控制台(或者由shell等管道),并且该stdin用于标准输入到一个程序..

那么为什么它至少在macOS上可以互换使用(标准输出为stdin,反之亦然?

例子:

  • 如果你运行cat /dev/stdin然后输入一些东西,它会回应它。 像cat /dev/stdout一样运行命令也是一样。

  • 同样, echo "Hey There" > /dev/stdoutecho "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

    上一篇: Why are stdin and stdout seemingly interchangeable?

    下一篇: Dynamic Parameter in Jenkinsfile?