标准是控制台窗口以外的任何东西

Is stdout Ever Anything Other Than a Console Window?

本文关键字:任何东 控制台 窗口 标准      更新时间:2023-10-16

来自 http://www.cplusplus.com/reference/iostream/cout/:

默认情况下,大多数系统将其标准输出设置为控制台,其中显示文本消息,尽管这通常可以重定向。

我从未听说过默认情况下或其他情况下stdout不是控制台窗口的系统。 我可以看到重定向在打印是一项昂贵操作的系统中可能是有益的,但这在现代计算机中应该不是问题,对吧?

当然可以。 我可能想将标准重定向到文本文件、另一个进程、套接字等等。

默认情况下,它是控制台,但重定向它的原因有很多,最有用的(与Unix哲学保持一致(是将一个程序的输出重定向到另一个程序的输入。 这允许人们创建许多小型的轻量级程序,这些程序相互馈送并作为更大系统的离散部分工作。

基本上,它只是一个简单而强大的数据共享机制。 由于我上面提到的原因,它在*nix系统上更受欢迎,但它也适用于Windows。

在大多数系统上,您可以将标准输入/输出/错误重定向到其他文件描述符或位置。

例如(在 Unix 上(:

./appname > output

将标准输出从 appname 重定向到名为 output 的文件。

./appname 2> errors > output

stdout重定向到名为 output 的文件,将所有错误从stderr重定向到名为 errors 的文件。

在 unix 系统上,您还可以让程序打开文件描述符并将其指向 stdin ,例如:

echo "input" > input
cat input | ./appname

这将导致程序从管道读取stdin


这就是在Unix中您可以将各种不同的实用程序"管道"在一起以创建一个更大的工具的方式。

find . -type f | ./appname | grep -iv "search"

这将运行 find 命令,并获取其输出并将其通过管道传输到 ./appname,然后 appname 的输出将被发送到 grep 的输入,然后搜索单词"search",仅显示匹配的结果。

它允许许多小型实用程序产生非常强大的效果。


想想><|,比如管道。

>就像水槽中的排水管,它接受数据并将其存储在您想要放置的位置。当 shell 遇到>时,它将打开一个文件。

> file

当 shell 看到上述内容时,它将使用标准系统调用open文件,并记住该文件描述符。在上述情况下,由于没有输入,它将创建一个空文件并允许您键入更多命令。

banner Hello

此命令以非常大的字母将 Hello 写入控制台,并会导致它滚动(我在这里使用 Unix,因为它是我最了解的(。输出只是简单地写入标准输出。使用"接收器"(>(,我们可以控制输出的位置,因此

banner Hello > bannerout

将导致 Banner 标准输出中的所有数据被重定向到 shell 打开的文件描述符,从而写入名为 bannerout 的文件。

管道的工作方式与>类似,因为它们有助于控制数据的流向。但是,管道不能写入文件,只能用于帮助数据流从一个点到另一个点。

例如,以下是流经几个变电站和废物清理的水:

pump --from lake | treatment --cleanse-water | pump | reservoir | pump > glass
水从

湖中流出,通过管道流向水处理厂,再从工厂流回泵,将其移动到水库,然后再次泵入市政水管,并通过水槽进入玻璃杯。

请注意,管道只是将所有输出连接在一起,最终它会进入您的玻璃杯。

这与命令的方式相同,并在 Linux 上的 shell 中处理它们。它还遵循一条路径来获得最终结果。

现在还有最后一件事我在之前的陈述中还没有讨论过,那就是<输入字符。它的作用是从文件中读取并将其输出到程序上的 stdin。

cat < bannerout

将简单地打印存储在横幅输出中的内容。如果您有要处理的文件,但由于不想在链中运行额外的命令而不想在前面加上cat <file>,则可以使用此选项。

所以试试这个:

echo "Hello" > bannerinput
banner < bannerinput

这将首先将字符串"Hello"放在文件bannerinput中,然后当您运行横幅时,它将从文件bannerinput读取。

我希望这能帮助你理解重定向和pipping在Unix上是如何工作的(如果不是大多数的话,一些也适用于Windows(。

到目前为止,所有的答案都在调用程序的事物(shell等(的上下文中。程序本身可以使stdout终端以外的其他东西。C 标准库提供了freopen,允许程序员在任何兼容环境中重定向标准输出。POSIX提供了许多其他机制(popenfdopen等(,使程序员有更多的控制权。我怀疑Windows提供了类似的机制。

三个标准文件描述符 0、1 和 2 可能发生任意数量的事情。任何人都可以启动一个新进程,并将文件描述符附加到他们喜欢的任何内容。

例如,GNU 屏幕将输出放入管道中,并允许动态重新连接会话。SSH 获取输出并将其返回到另一端。当然,所有众多的 shell 重定向器都会定期使用操作文件描述符。

要使

程序具有stdout,它必须在托管实现(带有操作系统的实现(上运行,或者在具有附加功能的独立实现上运行

如果没有某种控制台,我很难弄清楚这样的实现,但让我们假设火星探测器有一个完整的操作系统并且用 C(或 C++(编程并且没有那个控制台

/* 2001-07-15: JPL: stdout is the headquarters */
puts("Help. I'm stuck.");

可能已经将消息发送到了NASA总部。

如果你像这样运行程序,Windows和Linux都会stdout重定向到一个文件:

my_program > some_file

这是最常见的情况,但可以进行许多其他类型的重定向。在 Linux 上,您可以将stdout重定向到支持"文件描述符"接口的任何内容,例如管道、套接字、文件和其他各种内容。

一个可能想要重定向 stdout 的情况的简单示例是将信息传递给另一个程序时。 Unix/Linux 命令ps生成属于当前用户的进程列表。如果此列表很长,并且您想要搜索特定进程,则可以输入

ps | grep thing

这会将ps stdout重定向到grep thingstdin.

相关文章: