内部重定向如何在unix中工作

时间:2012-10-10 05:35:24

标签: unix redirect exec

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

如果我做'./a.out> tempFile'在控制台中。这是如何运作的?由于在a.out中有printf,理想情况下除了要在STDOUT中打印的文本外。重定向如何使用此文本,为什么我们在控制台中看不到任何输出,只在我们看到printf文本的文件中

4 个答案:

答案 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。有一些函数(dup2fropen)可以用来执行此操作,具体取决于您想要实现的重定向类型:

见这里:Redirecting the output of a child process

答案 3 :(得分:0)

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