【发布时间】:2025-12-09 23:20:03
【问题描述】:
我知道标准输入和标准输出(至少在 UNIX 用语中)是流缓冲区,标准输出用于从程序输出到控制台(或然后由外壳等通过管道传输),标准输入是用于程序的标准输入..
那么为什么至少在 macOS 上它们可以互换使用(stdout 作为标准输入,反之亦然?
例子:
如果你运行
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/stdin和/dev/stdout可以互换这一事实不意味着stdin和stdout可以互换。特别是,如果您使用> /dev/stdin启动进程,则无法从进程的标准输出流中读取。 -
@Brian 你是什么意思?这似乎有效:pastebin.com/Su3yuJax
-
这和我说的不一样。
std::fstream默认以读/写模式打开。如果您在终端上执行> foo,它将以只写模式打开foo,并且文件描述符将无法用于读取。 -
@Brian 对,我现在明白了。谢谢!
标签: c++ macos shell unix stdout