在bash中重定向stdout与使用fprintf(速度)在c中写入文件

我想知道哪个选项基本上更快.

最让我感兴趣的是重定向机制.我怀疑该文件是在程序开始时打开的./program>文件并在最后关闭.因此,每当程序输出一些东西时,它应该只是写入文件,就像听起来一样简单.是这样吗?然后我猜两种选择在速度方面都应该具有可比性.

或者它可能是一个更复杂的过程,因为操作系统必须执行更多操作?

这些选项之间没有太大区别(除了将文件作为严格选项降低了程序的灵活性).
为了比较这两种方法,让我们检查一下神奇实体FILE *背后的内容

所以在这两种情况下我们都有一个FILE *对象,一个文件描述符fd – 一个到OS内核的网关和内核基础设施,提供对文件用户终端的访问,这应该是(除非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区别在于文件描述符.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...