让我们举一个例子: 我有一个名为a.out的可执行文件。这包含二进制信息,用于将一些文本打印到printf的STDOUT cos。 所以当我给./a.out时,我会在控制台STDOUT看到printf的输出
如果我做'./a.out> tempFile'在控制台中。这是如何运作的?由于在a.out中有printf,理想情况下除了要在STDOUT中打印的文本外。重定向如何使用此文本,为什么我们在控制台中看不到任何输出,只在我们看到printf文本的文件中
答案 0 :(得分:3)
在UNIX中,所有内容都是一个文件。默认情况下,所有stdout
都是(例如)/dev/tty
文件,它是连接到控制台/终端/窗口的设备驱动程序。输出只是发送到该文件(设备驱动程序),导致它输出到您用于交互式I / O的任何内容。
像a.out >xyzzy.txt
这样的所有命令都是先将程序的标准输出连接到该文件而不是/dev/tty
,因此输出显示在那里。
答案 1 :(得分: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
会将它打印到stdout(可能会再次重定向的tee)并将其写入tempFile
答案 2 :(得分:0)
shell执行a.out并用文件tempFile替换stdout。有一些函数(dup2
,fropen
)可以用来执行此操作,具体取决于您想要实现的重定向类型:
答案 3 :(得分:0)
重定向是一个单独的过程,它将a.out的标准输出链接到tempFile而不是/ dev / tty(用于打印到终端的驱动程序)。因此,您只能在文件中看到输出,而不是在控制台中。 这应该在a.out执行之前完成。一旦链接由重定向操作符完成,您执行a.out就会开始并最终在文件中打印。