我知道stdin和stdout(至少在UNIX术语中)是流缓冲区,stdout用于从程序输出到控制台(或者被shell管道传输等),stdin用于程序标准输入。但是为什么在macOS上它们可以互换使用(stdout作为stdin,反之亦然)?
例如:
1. 如果你运行“cat /dev/stdin”,然后输入一些内容,它会回显出来。以“cat /dev/stdout”命令运行也是同样的结果。 2. 同样地,“echo“ Hey There”> /dev/stdout”和“echo“ Hey There”> /dev/stdin”都将“Hey There”输出回终端。 3. 它在C++中也可以工作:
例如:
1. 如果你运行“cat /dev/stdin”,然后输入一些内容,它会回显出来。以“cat /dev/stdout”命令运行也是同样的结果。 2. 同样地,“echo“ Hey There”> /dev/stdout”和“echo“ Hey There”> /dev/stdin”都将“Hey There”输出回终端。 3. 它在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/stdin
和/dev/stdout
可以互换使用,并不意味着stdin
和stdout
可以互换使用。特别是,如果您使用> /dev/stdin
启动进程,则无法从该进程的标准输出流中读取数据。 - Brian Bistd::fstream
默认以读/写模式打开。如果在终端上执行> foo
,它将以只写模式打开foo
,文件描述符将无法用于读取。 - Brian Bi