我对这三份文件的目的感到困惑.如果我的理解是正确的,stdin是程序写入其请求以运行进程中的任务的文件,stdout是内核写入其输出并请求其从中访问信息的进程的文件,stderr是输入所有异常的文件.在打开这些文件判断这些是否真的发生时,我发现似乎没有任何迹象表明这一点!

我想知道的是这些文件的目的是什么,用很少的技术术语绝对简化了答案!

推荐答案

Standard input-这是流程从您那里获取信息所读取的file handle.

Standard output-进程将常规输出写入此文件句柄.

Standard error-进程将诊断输出写入此文件句柄.

这是我能说的最简单的话:-)

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

当您的进程启动时,它应该已经打开了这些句柄,并且可以直接读取和/或写入它们.

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

例如:

my_prog <inputfile 2>errorfile | grep XYZ

这将:

  • my_prog人创建一个流程.
  • 打开inputfile作为标准输入(文件句柄0).
  • 打开errorfile作为标准错误(文件句柄2).
  • grep创建another流程.
  • 将标准输出my_prog连接到标准输入grep.

请回复您的 comments :

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

因为它们不是普通的文件.虽然UNIX将everything表示为某个文件系统中的一个文件,但在最低级别上并不是这样./dev层次 struct 中的大多数文件都是字符或块设备,实际上是一个设备驱动程序.它们没有大小,但有主设备号和次设备号.

当你打开它们时,你连接到的是设备驱动程序,而不是一个物理文件,而且设备驱动程序足够聪明,知道应该分别处理不同的进程.

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

Linux相关问答推荐

抛出主,即未捕获到SIGSEGV中的异常结果

如何告诉链接器不要在链接的共享库中查找某些符号?

重命名具有相同前缀的文件对中最旧的文件

从 ALSA USB 硬件设备获取 USB 设备文件路径

CMake:处理静态库和共享库的正确方法

`G++ 4.9.4` 中关于 WEXITSTATUS 的奇怪行为

Linux合并文件

为什么在 find 命令中使用 dirname 会 for each 匹配项提供点?

PHP factor 30 从 Linux 到 Windows 的性能差异

anon 对 pmap 意味着什么?

我需要 -D_REENTRANT 和 -pthreads 吗?

如何使用 AWK 合并两个文件?

用于 GCC/G++ 的宏来区分 Linux 和 Mac OSX?

与交换空间相关的链接器性能?

php.ini 更改,但在 Ubuntu 上无效

zsh/bash 上不区分大小写的 Glob

比较linux中两个未排序的列表,列出第二个文件中的唯一性

如何在 shell 脚本中向文件中添加一行?

cat、grep 和 cut - 翻译成 python

libaio.so.1:无法打开共享对象文件