当前位置: 首页 > 面试题库 >

对stdin,stdout和stderr感到困惑?

马博学
2023-03-14
问题内容

我对这三个文件的目的感到困惑。如果我的理解是正确的,stdin则是程序在其中写入其在进程中运行任务的请求stdout的文件,是内核在其中写入其输出以及请求其从中访问信息的进程stderr的文件,并且是该文件。输入所有例外。在打开这些文件以检查它们是否确实发生时,我似乎没有任何暗示!

我想知道的是这些文件的用途到底是什么,用很少的技术术语就可以完全肯定答案!


问题答案:

标准输入 -这是您的过程读取以获取您的信息的 文件句柄

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

标准错误 -您的进程将错误信息写入此文件句柄。

这就是我所能做到的愚蠢:-)

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

当您的进程开始时,它应该已经打开了这些句柄,并且可以从中读取和/或写入它们。

默认情况下,它们可能已连接到您的终端设备(例如/dev/tty),但是通过Shell,您可以在进程开始之前(这些进程中的某些)在这些句柄与特定文件和/或设备(甚至是通往其他进程的管道)之间建立连接。可能的操作相当聪明)。

一个例子是:

my_prog <inputfile 2>errorfile | grep XYZ

这将:

  • 为创建一个过程my_prog
  • 打开inputfile作为标准输入(文件句柄0)。
  • errorfile作为标准错误打开(文件句柄2)。
  • 为…创建 另一个 过程grep
  • 将的标准输出附加my_prog到的标准输入grep

发表您的评论:

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

这是因为它们不是普通文件。尽管UNIX将 所有内容都
以文件形式显示在文件系统中的某个位置,但是在最低级别上却并非如此。/dev层次结构中的大多数文件是字符设备或块设备,实际上是设备驱动程序。它们没有大小,但确实有主设备号和次设备号。

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

Linux /proc文件系统也是如此。这些不是真实的文件,只是对内核信息进行严格控制的网关。



 类似资料:
  • 我有一个程序,通过Pipe. SourceChannel将stdout、stderr和stdin传输到/从Bytes Buffers。 程序使用选择器注册每个通道。 循环中的程序定期遍历 selectedKeys 集中的每个键,这些键对应于 stdout、stderr 和 stdin。对于每个密钥,它确定密钥是否有效、可读或可写,如果是,则与 ByteBuffer 执行相应的 IO 操作 我的问题

  • 在 Linux 中,一切都只是文件。这意味着,对于控制台程序: 键盘表示为一个文件,Bash 从中读取你的输入。 显示器表示为一个文件,Bash向输出写入它。 让我们假设,你有一个程序可以计算文件中的行。你可以通过键入wc -l来调用它。现在尝试一下 没有发生什么事吧?它只是卡在那里。错了,它正在等待你的输入。这是它的工作原理: line_counter = 0 while end of file

  • 我正在尝试提出一种解决方案,它涉及在连接操作之后应用一些逻辑,从多个中的中选择一个事件。这类似于reduce函数,但它只返回1个元素,而不是递增地返回。因此最终结果将是单个(,对,而不是一个 每个键保证只到达一次。 假设像上面这样的连接操作,它用4个生成了1个,成功地连接并收集在。现在,我想做的是,立即访问这些值,并执行一些逻辑以将正确匹配到一个。例如,对于上面的数据集,我需要(,和)。 将为每个

  • 所以我一直在读Kafka的语义学,我对它的工作原理有点困惑。 我理解生产者如何避免发送重复的消息(以防代理的ack失败),但我不明白的是,在消费者处理消息但在提交偏移量之前崩溃的情况下,一次是如何工作的。Kafka不会在这种情况下重试吗?

  • 问题内容: 我已经在eclipse中创建了一个项目,并添加了Maven依赖项。在Eclipse中,它表示我正在使用JRE 1.5。一切在Eclipse中都可以正常运行,例如,我可以运行测试。 当我尝试从终端运行时,出现以下错误。 …在-source 1.3中不支持泛型(使用-source 5或更高版本来启用泛型)… 看来,Maven认为我正在使用JRE 1.3,并且无法识别泛型或for-each循

  • 问题内容: 在碰到此链接http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using- executors-and-threadpoolexecutor 之后,这是我第一次为新项目使用Java线程池。 .html ,我对此更加困惑,这是页面中的代码, 在代码中,创建了一个固定大小的池并创建了10个工作线程,对吗? 线程池应该