让我们举个例子:我有一个名为 a.out 的可执行文件。这包含将一些文本打印到 printf 的 STDOUT cos 的二进制信息。所以当我给出 ./a.out 时,我会在控制台 STDOUT 上看到 printf 的输出
假设我在控制台中执行“./a.out > tempFile”。这是如何运作的?由于 a.out 中有 printf,理想情况下 i 除了要在 STDOUT 中打印的文本。重定向如何使用此文本以及为什么我们在控制台中看不到任何输出,而仅在文件中我们看到 printf 文本
在 UNIX 中,一切都是文件。默认情况下,所有stdout
都是(例如)/dev/tty
文件,它是连接到您的控制台/终端/窗口的设备驱动程序。输出只是发送到该文件(设备驱动程序),这会导致它输出到您用于交互式 I/O 的任何内容。
所有 a 命令a.out >xyzzy.txt
所做的只是首先将程序的标准输出连接到该文件而不是/dev/tty
,因此输出显示在那里。
在 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
shell 执行 a.out 并将 stdout 替换为文件 tempFile。根据您想要实现的重定向类型,可以使用一些函数 ( dup2
, ) 来执行此操作。:fropen
请参阅此处:重定向子进程的输出
重定向是一个单独的过程,它将 a.out 的标准输出链接到 tempFile 而不是 /dev/tty(用于打印到终端的驱动程序)。因此,您只能在文件中看到输出,而不是在控制台中。这应该在 a.out 执行之前完成。重定向运算符完成链接后,您的 a.out 执行将开始并最终打印到文件中。