stdout 和 STDOUT_FILENO 有什么区别?

2023-12-26

我想知道两者之间的区别stdout and STDOUT_FILENO在Linux/C中,经过一番研究,我得出以下理解:

  • stdout属于C语言的标准I/O流,其类型为FILE*并定义在stdio.h.

  • STDOUT_FILENO is an int值定义在unistd.h。它是LINUX系统的文件描述符。在unistd.h,解释如下:

应为文件流定义以下符号常量:

STDERR_FILENO
    File number of stderr; 2.
STDIN_FILENO
    File number of stdin; 0.
STDOUT_FILENO
    File number of stdout; 1.

所以,在我看来,STDOUT_FILENO属于系统级调用,某种程度上类似于系统API。STDOUT_FILENO可用于描述系统中的任何设备。

The stdout位于更高级别(用户级别?)并且实际上封装了细节STDOUT_FILENO; stdout有I/O缓冲器。

这就是我对他们差异的理解。你能帮我检查一下并纠正其中的错误吗?如有任何意见或指正,我们将不胜感激,谢谢。


stdout is a FILE*给出标准输出流的指针。很明显fprintf(stdout, "x=%d\n", x);具有相同的行为printf("x=%d\n", x);;你用stdout for <stdio.h>函数如fprintf(), fputs() etc..

STDOUT_FILENO是一个整数文件描述符(实际上是整数1)。你可能会用它来write系统调用。

两者之间的关系是STDOUT_FILENO == fileno(stdout)

(Except after you do weird things like fclose(stdout);, or perhaps some freopen after some fclose(stdin), which you should almost never do! See this /q/25516375/4279, as commented by J.F.Sebastian /users/4279/j-f-sebastian)

您通常更喜欢FILE*的东西,因为它们是缓冲的(所以通常表现良好)。有时,您可能想打电话fflush()刷新缓冲区。

您可以使用文件描述符编号syscalls http://en.wikipedia.org/wiki/Syscall例如write() http://www.kernel.org/doc/man-pages/online/pages/man2/write.2.html(这是由stdio图书馆),或poll() http://www.kernel.org/doc/man-pages/online/pages/man2/poll.2.html。但使用系统调用很笨拙。它可能会给你带来非常好的效率(但这很难编码),但很多时候stdio库足够好(而且更便携)。

(当然你应该#include <stdio.h>对于 stdio 功能,以及#include <unistd.h>- 以及其他一些标头 - 对于系统调用,例如write。并且stdio函数是通过系统调用实现的,所以fprintf()可能会打电话write()).

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

stdout 和 STDOUT_FILENO 有什么区别? 的相关文章

随机推荐

  • Azure 上的 Asp.net MVC 5.2.2

    将 mvc nuget 包从版本 5 1 0 升级到 5 2 2 后 我们在 Azure 上的计算机 webrole 拒绝启动 Web 角色 它处于回收状态 我在事件日志中发现了一个错误 The description for Event
  • 如何将字符串截断为最多 N 个字符?

    预期的方法String truncate usize https doc rust lang org std string struct String html method truncate失败是因为它不考虑 Unicode 字符 考虑到
  • 如何处理 cv::VideoCapture 解码错误?

    我使用 OpenCV 的 VideoCapture 使用 ffmpeg 支持编译 从 IP 摄像机流式传输 H264 内容 到目前为止 一切正常 但每隔一段时间我就会遇到解码错误 我猜是来自 ffmpeg h264 0x103006400
  • 查找单个元素上的所有数据属性

    有人知道一种快速有效的方法来从单个元素中获取所有数据属性吗 我意识到 jQuerys data 会这样做 但是它不会给我使用 attr 设置的数据属性 除非我首先使用 data 选择数据属性 此外 您无法通过使用 data 添加的数据属性来
  • 如何在 Swift 中将 [Int8] 转换为 [UInt8]

    我有一个仅包含字符的缓冲区 let buffer Int8 然后我需要将其传递给一个函数process以 UInt8 作为参数 func process buffer UInt8 some code 传递 Int8 缓冲区以转换为 Int8
  • 按年龄对某个范围内的用户进行分组

    我有一些数据需要进行一些统计 我需要按年龄对用户进行分组 var byAge displayResult GroupBy x gt x Age 我可以按照上面的方法做 然而 这给了我 19 20 21 等年龄 我想要的是按 10 岁对年龄进
  • 使用 REST API 创建项目后,将用户作为管理员分配给项目 - Azure DevOps

    我正在尝试将用户分配为项目的管理员 并通过 Azure DevOps 中的 REST API 更改所有者 你们中的任何人都可以向我指出一些如何完成此操作的文档吗 我已经查看了 UserEntitlements API 和 Project A
  • 重试 HTTP(S) POST,直到在 Android 上成功

    我有一些数据将通过 http s 从 Android 应用程序发送到服务器 需要按顺序发送 是否已经存在一种对 http 请求进行排队 针对同一服务器 并重试它们直到完成 不一定成功 的方法 我的问题是如果没有网络覆盖 http请求可能会失
  • 如何更改C# Winform中文本框中某些子字符串的字体颜色?

    如果我想将文本文件上传到文本框中并希望通过字体颜色更改突出显示某些单词 我知道我需要编写TextBox ForeColor Color SomeColor 但如果我想要那个并非所有文本都会出现在same color 只有一些子串 我怎样才能
  • 在 ASP.NET 中拉取多个记录集时的 DataReader 或 DataSet

    我有一个 ASP NET 页面 其中有一堆需要填充的控件 例如下拉列表 我想单次访问数据库并带回多个记录集 而不是为每个控件进行往返 我可以带回 DataSet 中的多个表 或者可以带回 DataReader 并使用 NextResult
  • 为什么SIGPIPE存在?

    据我了解 SIGPIPE只能作为以下结果发生write 它可以 并且确实 返回 1 并设置errno to EPIPE 那么为什么我们会有额外的信号开销呢 每次我使用管道时我都会忽略SIGPIPE并且从未因此感到任何疼痛 我是否错过了什么
  • onDraw() 没有被调用

    我正在修复某人的 Android 应用程序 它最初是为 2 1 制作的 我正在努力让它工作到 4 0 不幸的是 制作该应用程序的人不在身边 所以我只能使用他的代码 该应用程序实现了自定义滑块 水平和垂直 我固定了垂直滑块 但无法使水平滑块工
  • 如何在非主线程中获取剪贴板数据?

    我正在尝试使用以下代码从剪贴板获取数据 private void TestBtn Click object sender EventArgs e Thread sampleThread new Thread SampleMethod sam
  • 如何通过 Google Sheets API 更新多个单元格?

    我正在尝试更新并从谷歌表格中获取一些结果 它正在工作但速度很慢 我需要batchUpdate并获取数据 这是我的脚本 foreach import cels as celu gt valoare range ins celu valueRa
  • 使用渐变但不混合颜色

    我不知道这是一个愚蠢的问题还是类似的问题 但我想要一个div用一种颜色填充一定比例 其余部分用另一种颜色填充 以及梯度属性 div background linear gradient to right 000 50 fff 50 Resu
  • Unicode 中为什么会有重复的字符?

    我可以看到一些重复的字符Unicode http en wikipedia org wiki Unicode 例如 字符 C 可以由代码点 U 0043 和 U 0421 表示 为什么会这样呢 正如其他人所指出的 您在这里的主要谬误是混淆了
  • ManualResetEvent WaitOne 阻止我的 CollectionView 的所有者线程

    我编写了一个 WPF WizardFramework 它使用一些在后台执行一些操作BackgroundWorker 在处理时可能会发生我必须更新ObservableCollection这与我的用户界面绑定 对于这种情况我写了一个Thread
  • JavaFX 上 Canvas.snapshot() 的替代方案

    我正在开发一个小型图形引擎Canvas在JavaFX中 在某些时候 我必须渲染离屏图像 然后使用其将其打印在我的主画布上GraphicContext 我现在正在使用这段代码 private Canvas offScreenCanvas pr
  • 为什么我可以在循环中创建多个同名实例?

    我不明白为什么会这样 我希望有人能向我解释一下 这是一个例子 TestObject array new TestObject 10 for int i 0 i lt 10 i TestObject object new TestObject
  • stdout 和 STDOUT_FILENO 有什么区别?

    我想知道两者之间的区别stdout and STDOUT FILENO在Linux C中 经过一番研究 我得出以下理解 stdout属于C语言的标准I O流 其类型为FILE 并定义在stdio h STDOUT FILENO is an