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

2023-12-21

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

我最感兴趣的是重定向机制。我怀疑该文件是在程序启动时打开的./program > file并在最后关闭。因此,每次程序输出一些内容时,都应该将其写入文件,就像听起来一样简单。是这样吗?那么我想这两种选择在速度方面应该是相当的。

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


这些选项之间没有太大区别(除了将文件设置为严格选项会降低程序的灵活性)。 为了比较这两种方法,让我们检查一下,魔法实体背后隐藏着什么FILE*:

所以在这两种情况下我们都有一个FILE*对象,文件描述符fd- 通往操作系统内核和内核基础设施的网关,提供对文件或用户终端的访问,这应该(除非 libc 有一些specialstdout 或内核的初始化程序专门处理 fd = 1 的文件)。

与 bash 重定向相比如何工作fopen()?

当 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 的主要区别在于文件描述符的处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bash 中的 stdout 重定向与使用 fprintf 写入 c 中的文件(速度) 的相关文章

随机推荐

  • 批处理文件 - 选择、缩进提示

    我正在使用批处理文件中的选择来显示这样的提示 choice set P c Is this Correct Y N if I c EQU Y goto movespot if I c EQU N goto exitspot goto cho
  • iframe 不停止加载

    正如中所回答的这个帖子 https stackoverflow com questions 5050380 set innerhtml of an iframe 我正在尝试设置 Iframe 的内容 document getElementB
  • 智能文件搜索窗口可以忽略空格并在代码中搜索?

    有谁知道一个基于Windows的搜索工具 易于使用并且是程序员 友好的 我正在寻找的功能 忽略搜索中的空白 有能力找到 myTestFunction parameter another parameter yet another param
  • 使用PowerShell创建自签名证书

    我使用与此处找到的代码类似的代码来创建在 IIS 中使用的自签名证书 http blogs technet com b vishalagarwal archive 2009 08 22 generating a certificate se
  • Haskell 函数取出最后一次出现的输入字符

    我在编写这个函数时遇到问题 该函数需要一个字符和一个字符列表 然后消除列表中该输入字符的最后一次出现 我能够使用下面的函数取出输入字符的第一次出现 fun Char gt String gt String fun c s ss s c ss
  • Xcode 8.1 推送通知在 swift 2.3 中与 firebase 集成没有得到?

    我正在使用 Xcode 8 1 和 swift 2 3 在这里我使用 firebase 集成来获取推送通知 我不知道为什么我没有收到通知 我的代码 func application application UIApplication did
  • 获取数据表中满足特定条件的行数

    我有一个数据表 dtFoo 并且想要获取满足特定条件的行数 编辑 此数据未存储在数据库中 因此不能选择使用 SQL 过去 我使用了以下两种方法来实现此目的 Method 1 int numberOfRecords 0 DataRow row
  • 关于空值的可比合同和比较合同

    Comparable合同规定e compareTo null 必须扔NullPointerException From the API http java sun com javase 6 docs api java lang Compar
  • 无法编译使用 ncurses 的 C/C++ 代码 [重复]

    这个问题在这里已经有答案了 我刚刚发现 ncurses 并且刚刚开始学习它 但是我的教程中的示例无法在我的计算机上编译 我必须手动安装 ncurses 并通过输入 apt get install libncurses5 dev libncu
  • 丰富的片段:rel="nofollow" 和 RDFa

    我在用着根据集合标记我的内容schema org http schema org 我在用RDFa精简版 http www w3 org TR rdfa lite 这样做 我现在遇到了问题rel属性 我的一些链接确实有rel nofollow
  • 使用 JUnit 测试图形生成

    我正在使用 Java 的 Graphics2D 生成图形的图形表示 我还使用 ImageIO 来编写 PNG 文件 ImageIO write image png out 我想知道应该如何编写 JUnit 测试来测试生成的图形是否符合预期
  • 使用 Intel MKL 的 3D 卷积

    我正在尝试使用 Intel 计算 3D 阵列的 3D 卷积MKL 有人可以给我一些提示吗 是否可以使用实现MKL 提前致谢 英特尔有他们页面上的示例 https software intel com en us node 4713903D
  • C# StreamReader,用于自定义分隔符的“ReadLine”

    拥有该功能的最佳方式是什么StreamReader ReadLine 方法 但带有自定义 字符串 分隔符 我想做这样的事情 String text while text myStreamReader ReadUntil my delim n
  • 如何使用提示(如简单的计算器)对数字求和? [复制]

    这个问题在这里已经有答案了 我尝试使用 JavaScript 来做一件非常简单的事情 一个百分比计算器 这是代码 var num prompt What is the number var perc prompt What is the p
  • 在 C# 中通过网络发送大文件的好方法?

    我正在尝试构建一个应用程序 该应用程序可以从网络中另一台计算机上运行的服务请求文件 这些文件可能相当大 有时 500mb 以上 我正在考虑通过 TCP 发送它 但我担心它可能需要将整个文件存储在内存中 可能只有一个客户 复制到共享目录也是不
  • 反应本机地铁是节点模块中缺少路径

    错误是这样的 Error Unable to resolve module metro src lib bundle modules HMRClient Here is additional error logs 当我必须创建一个新项目并运
  • 捕获 dll 异常后访问冲突

    我必须在运行时动态地将模块加载为 dll 因为它们事先并不知道 只是它们符合类接口 我注意到的是 在我捕获 dll 抛出的异常 在主线程的主程序中 后 会调用正确的析构函数 并销毁模块并卸载 dll 但随后作为 catch 块末尾的 当 V
  • 如何将 thenAnswer 与返回 void 的方法一起使用

    我想对以下方法进行单元测试 public void addRecord Record record Myclass newObj new Mycalss It creates newObj object set some values us
  • ORA-01000: 使用 Spring SimpleJDBCCall 时超出最大打开游标数

    我们使用 Spring SimpleJdbcCall 来调用 Oracle 中返回游标的存储过程 看起来 SimpleJdbcCall 没有关闭游标 并且在一段时间后超出了最大打开游标数 ORA 01000 maximum open cur
  • bash 中的 stdout 重定向与使用 fprintf 写入 c 中的文件(速度)

    我想知道哪个选项基本上更快 我最感兴趣的是重定向机制 我怀疑该文件是在程序启动时打开的 program gt file并在最后关闭 因此 每次程序输出一些内容时 都应该将其写入文件 就像听起来一样简单 是这样吗 那么我想这两种选择在速度方面