这些选项之间几乎没有什么区别(除了将文件作为严格选项会降低程序的灵活性)。
为了比较两种方法,让我们看看神奇实体FILE*
背后的内容:
![](https://i.imgur.com/AroNuW1.png)
因此,在两种情况下,我们都有一个FILE*
对象,一个文件描述符fd——连接到操作系统内核和内核基础设施的网关,该基础设施提供对文件或用户终端的访问,这应该是(除非libc具有一些特殊的stdout初始化器或内核专门处理fd = 1的文件)。
与fopen()
相比,bash重定向如何工作?
当bash重定向文件时:
fork() // new process is created
fd = open("file", ...) // open new file
close(1) // get rid of fd=1 pointing to /dev/pts device
dup2(fd, 1) // make fd=1 point to opened file
close(fd) // get rid of redundant fd
execve("a") // now "a" will have file as its stdout
// in a
stdout = fdopen(1, ...)
当您自己打开文件时:
fork() // new process is created
execve("a") // now "a" will have file as its stdout
stdout = fdopen(1, ...)
my_file = fopen("file", ...)
fd = open("file", ...)
my_file = fdopen(fd, ...)
所以正如您所看到的,主要的Bash区别在于对文件描述符进行微调。
fprintf
。当你在使用纯shell和打印输出的工具时,你将重定向输出。此外,如果你没有任何BASH怎么办?那么你肯定会使用fprintf
。 - ForceBrustdout
或直接写入文件之间的性能差异可以忽略不计且无法测量。从操作系统的角度来看,实际上没有任何区别。 - Some programmer dude