对 stdin、stdout 和 stderr 感到困惑吗?

2024-04-11

我对这三个文件的用途感到相当困惑。如果我的理解是正确的话stdin是程序写入其请求以在进程中运行任务的文件,stdout是内核将其输出写入其中的文件,并且请求它的进程从中访问信息,并且stderr是输入所有异常的文件。在打开这些文件以检查这些是否确实发生时,我发现似乎没有任何迹象表明如此!

我想知道的是这些文件的确切用途是什么,完全用很少的技术术语来简单地回答!


标准输入- 这是文件句柄您的进程读取该信息以从您那里获取信息。

标准输出- 您的进程将常规输出写入此文件句柄。

标准误- 您的进程将诊断输出写入此文件句柄。

这已经是我能做到的最愚蠢的了:-)

当然,这主要是按照惯例。如果您愿意,没有什么可以阻止您将诊断信息写入标准输出。您甚至可以完全关闭三个文件句柄并打开您自己的 I/O 文件。

当您的进程启动时,它应该已经打开了这些句柄,并且只能读取和/或写入它们。

默认情况下,它们可能连接到您的终端设备(例如,/dev/tty)但是 shell 将允许您在进程启动之前在这些句柄和特定文件和/或设备(甚至到其他进程的管道)之间建立连接(一些可能的操作相当聪明)。

一个例子是:

my_prog <inputfile 2>errorfile | grep XYZ

这将:

  • 创建一个流程my_prog.
  • open inputfile作为您的标准输入(文件句柄 0)。
  • open errorfile作为您的标准错误(文件句柄 2)。
  • create another过程为grep.
  • 附上标准输出my_prog到标准输入grep.

回复您的评论:

当我在 /dev 文件夹中打开这些文件时,为什么我永远看不到正在运行的进程的输出?

这是因为它们不是普通文件。虽然 UNIX 呈现一切作为文件系统中某处的文件,这并不意味着它在最低级别上如此。大多数文件位于/dev层次结构要么是字符设备,要么是块设备,实际上是设备驱动程序。它们没有尺寸,但有主设备号和次设备号。

当您打开它们时,您将连接到设备驱动程序而不是物理文件,并且设备驱动程序足够智能,知道应该单独处理单独的进程。

Linux 也是同样的情况/proc文件系统。这些不是真正的文件,只是严格控制的内核信息网关。

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

对 stdin、stdout 和 stderr 感到困惑吗? 的相关文章

随机推荐

  • 导入模块时内存使用差异

    我想知道以这些方式导入模块时内存使用情况有什么区别 import Mod1 from Mod1 import from Mod1 import a b c 主要介于前两者之间 第一个使用最少的内存 因为它只在模块范围中创建单个名称 第二个使
  • libgcc.a 和 libgcc_s.a 之间的区别?

    我们已经安装了 GCC 和libgcc在 AIX 6 1 上使用 RPM 文件 我想知道的是为什么 libgcc s a 没有在以下文件夹下创建 opt freeware lib gcc powerpc ibm aix6 1 0 0 4 2
  • ASP.NET 母版页 DefaultButton 覆盖

    我有一个带有表单元素的母版页 并将 defaultbutton 属性设置为服务器端 ImageButton 在我的其中一个页面上 我想通过在 Page Load 事件中设置 Forms DefaultButton 来 覆盖 母版页默认按钮属
  • UILabel 文本没有改变,但是 xx.title 正在工作

    我有两个视图控制器 在第一个视图控制器中 我有名称列表 当我单击它时 我希望在第二个视图控制器中显示相同的名称 我有下面的代码 void tableView UITableView tableView didSelectRowAtIndex
  • didChangeObject:未调用 NSFetchedResultsController

    我几乎尝试了所有方法 但无法找出问题所在 我有一个 NSFetchedResultsController 并从核心数据中获取一些帖子 然后我有一个方法 可以将新帖子插入到同一上下文中并保存上下文 通常 现在应该调用 didChangeObj
  • 将图像置于 div 中居中

    我已经在 a 中设置了图像的边框div成为无 我现在想将该图像放在其包含的 div 中居中 我尝试过使用margin 0 auto 但这没有用 我确信我忽略了一些愚蠢的事情 但我想寻求 stackoverflow 社区的帮助 这样我就不需要
  • Azure WebJobs SDK 基础知识

    我想了解 Azure WebJobs SDK 上的 JobHostConfiguration 我在哪里可以找到配置 它在 app config 上吗 JobHostConfiguration 如何识别这是不是 IsDevelopment 我
  • 自定义属性与非自定义属性?

    实现的东西ICustomAttributeProvider接口将允许您获取已通过以下方式应用到它的自定义属性GetCustomAttributes方法 据我了解 自定义属性基本上是一个特殊的类 以 Attribute 结尾并扩展Attrib
  • iCloud Drive 通过 NSMetadataQuery 列出目录和文件

    I have built an iCloud enabled app named rmc My app now can upload files to iCloud Drive and get metadata by NSMetadataQ
  • Asp.net MVC Web Api Http 放置和删除请求失败

    我正在使用 Asp net MVC 4Web Api项目 我的应用程序使用 mvc 来实现网站 它向 Web API 发出 http 请求以实现服务器功能 对控制器的常规页面请求工作正常 并且能够显示网页 该应用程序能够使get and p
  • Hibernate Annotations - 字段访问和属性访问哪个更好?

    这个问题有点相关Hibernate注解放置问题 https stackoverflow com questions 305880 hibernate annotation placement question 但我想知道哪个是better
  • 窗口后 Apache-beam 挂在 groupbykey 上 - 不触发

    TLDR 如何使用 python SDK 更正触发计数窗口 Problem 我正在尝试创建一个用于转换和索引维基百科转储的管道 目标是 从压缩文件中读取 只需一个进程并以流式传输方式 因为该文件不适合 RAM 并行处理每个元素 ParDo
  • 隐式声明的特殊成员函数

    基本上隐式声明了四个特殊函数 默认构造函数 默认析构函数 默认赋值运算符 默认成员复制运算符 问题 如果其中任何一个是由用户定义的 例如 析构函数 其余三个函数将不会被声明 这是正确的吗 或者 它只适用于默认构造函数 而复制构造函数 如果你
  • 寻找一个已经实现二叉树的java库[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有可以使用的具有二叉树的java库 我并不期待测试和实施我自己的 Java 标准 API 只包含普遍
  • (使用 -source 7 或更高版本在交换机中启用字符串)错误;Netbeans 7.1.2

    我使用的是 JDK 7 和 Netbeans IDE 7 1 2 正在经历在 switch 中使用字符串 http docs oracle com javase tutorial java nutsandbolts switch html
  • 安装 Firebase for React 时出现 Grpc 错误

    我已经尝试修复这个错误两天了 我所做的就是得到错误 创建反应应用程序名称 cd 应用程序名称 npm install firebase save 这是未能正确安装的部分 这些是我尝试过的主要修复 安装最新版本的Python 3并将其添加到W
  • 从 ES 6 中的对象获取一些属性的单行代码

    如何在 ES6 中以最紧凑的方式编写一个只需要几个属性的函数 我想出了使用解构 简化对象文字的解决方案 但我不喜欢代码中重复字段列表 有没有更苗条的解决方案 v gt let id title v return id title 这是更精简
  • 在 d3.js 中绘制已投影的 geoJSON 地图

    使用 d3 js v3 时 我在使用 geoJSON 数据绘制地图时遇到问题 代码和生成的地图显示在 http bl ocks org 73833ec90a8a77b0e29f http bl ocks org 73833ec90a8a77
  • 如何从主查询中选择计数到子查询中

    我想将主查询中选择的记录数获取到子查询中 我当前尝试执行的查询是 SELECT cat id category name seo name SELECT count category name FROM ccs coupons WHERE
  • 对 stdin、stdout 和 stderr 感到困惑吗?

    我对这三个文件的用途感到相当困惑 如果我的理解是正确的话stdin是程序写入其请求以在进程中运行任务的文件 stdout是内核将其输出写入其中的文件 并且请求它的进程从中访问信息 并且stderr是输入所有异常的文件 在打开这些文件以检查这