2

让我们举个例子:我有一个名为 a.out 的可执行文件。这包含将一些文本打印到 printf 的 STDOUT cos 的二进制信息。所以当我给出 ./a.out 时,我会在控制台 STDOUT 上看到 printf 的输出

假设我在控制台中执行“./a.out > tempFile”。这是如何运作的?由于 a.out 中有 printf,理想情况下 i 除了要在 STDOUT 中打印的文本。重定向如何使用此文本以及为什么我们在控制台中看不到任何输出,而仅在文件中我们看到 printf 文本

4

4 回答 4

3

在 UNIX 中,一切都是文件。默认情况下,所有stdout都是(例如)/dev/tty文件,它是连接到您的控制台/终端/窗口的设备驱动程序。输出只是发送到该文件(设备驱动程序),这会导致它输出到您用于交互式 I/O 的任何内容。

所有 a 命令a.out >xyzzy.txt所做的只是首先将程序的标准输出连接到该文件而不是/dev/tty,因此输出显示在那里。

于 2012-10-10T05:40:20.817 回答
2

在 unix 中,一切都是文件/文件流

一个 unix 进程默认连接了 3 个文件流:

0 = stdin
1 = stdout
2 = stderr

“通常”,stdin 连接到将解析您的键盘输入的终端仿真,而 stdout/stderr 连接到将提供您的显示的终端仿真。

终端模拟器可能是 xterm、gnome-terminal、kterm 或 linux 虚拟控制台(“textmode-console”)

当您重定向时,流只是连接到不同的源/目标。因此,将转到终端仿真的每个文本都将转到该文件。

如果你想要两者,“tee”可能是一个选项:

./a.out | tee tempFile   

会将其打印到标准输出(tee 的,您可能会再次重定向)并将其写入 tempFile

于 2012-10-10T05:40:51.963 回答
0

shell 执行 a.out 并将 stdout 替换为文件 tempFile。根据您想要实现的重定向类型,可以使用一些函数 ( dup2, ) 来执行此操作。:fropen

请参阅此处:重定向子进程的输出

于 2012-10-10T05:41:56.537 回答
0

重定向是一个单独的过程,它将 a.out 的标准输出链接到 tempFile 而不是 /dev/tty(用于打印到终端的驱动程序)。因此,您只能在文件中看到输出,而不是在控制台中。这应该在 a.out 执行之前完成。重定向运算符完成链接后,您的 a.out 执行将开始并最终打印到文件中。

于 2012-10-10T18:20:00.540 回答