【发布时间】:2015-10-08 06:57:39
【问题描述】:
标准输入和标准输出是否独立?
假设父程序启动了一个子程序,父程序的标准输出附加到子程序的标准输入,子程序的标准输出附加到父程序的标准输入。
stdin <- stdout
parent child
stdout -> stdin
如果子进程(异步)不断地从其标准输入读取数据并将数据写入其标准输出,但父进程只是向子进程的标准输入写入数据,而根本没有从子进程的标准输出读取数据:
stdin| << stdout
parent child
stdout ==>==> stdin
最终会出现阻塞吗?标准输入和标准输出是否共享任何类型的缓冲区?如果需要回答,特别是通过 C++ std::cin (istream) 和 std::cout (ostream)。标准是否要求他们共享或不共享此类内容,还是由实施决定?
会发生什么?
【问题讨论】:
-
当您谈论重定向和阻塞时,您应该使用它们的 Unix 名称 stdin 和 stdout 来引用这些流,而不是使用它们的 C++ 名称。
-
他们为什么要共享一个缓冲区?
-
@JonathonReinhart tyvm,已编辑。
-
我建议流的语言无关名称是“标准输入”和“标准输出”。名称
stdin是标准输入文件流的C 语言标识符,stdout是标准输出文件流的C 语言名称。这些对应于 C++ 中的类似名称:stdin对应于<cstdio>中的std::stdin(我认为,<stdio.h>中的::stdin),也对应于std::cin,尽管 I/O 函数与std::cin与std::stdout使用的有很大不同;和stdout对应于std::stdout(::stdout) 和std::cout。
标签: c++ terminal stdout stdin piping