什么和为什么?- 文件描述符

Joe*_*oey 3 filesystems files

什么是文件描述符? 我们为什么需要它们?

Gil*_*il' 11

文件描述符是一个数字,表示进程中打开的文件。这是程序记住它正在操作的文件的一种方式。打开一个文件寻找一个空闲编号,并将其分配给该进程的文件描述符表中的文件;关闭文件将从进程的描述符表中删除该条目。一个进程中的文件描述符n与另一个进程中具有相同编号的文件描述符之间没有关系。

“每个文件都有其中的三个(stdin、stdout、stderr)”是无稽之谈。进程有文件描述符,而不是文件。进程可以并且经常有三个以上的文件描述符,也可以更少。Stdin、stdout 和 stderr 是文件描述符 0、1 和 2 的名称,因为它们具有传统含义:stdin(标准输入)是程序应该读取用户输入(如果需要)、stdout(标准输出)的地方是程序应该写入它产生的数据的地方(如果它愿意的话),而 stderr(标准错误)用于错误消息。Stdin 和 stdout 可用于旨在在命令行上使用的程序,尤其是在管道中;我邀请您阅读连接 STDOUT 和 STDIN 是什么意思?和(更高级)一个命令怎么会有多个输出?


gol*_*cks 5

它们由一个 int 表示

是的,它们是从零开始编号的,这是对类似类型的独特项目进行会计处理的一种常见且直接的方法。有点像运动衫。例如,一支球队可能有几个守门员,但你知道在任何给定的时间点上哪个守门员在上场,因为球队的每个成员都有一个唯一的号码。这是唯一的意义。

什么是文件描述符?

它指的是输入/输出管道。通常它们只是其中之一,但也可能两者兼而有之。

每个文件都有三个

通常每个进程至少有三个,这是 *nix 风格操作系统的一个特性。

我们为什么需要它们?

您不需要它们,除非您想对当前进程以外的其他内容进行输入/输出。然而,在这样一个过程中,“你”在“我写这个”的意义上是抽象的,因为包括你在内的任何人都不可能有意义地使用它。进程不是凭空存在的,它们是由操作系统管理的实体,需要与其他实体交互,访问文件,硬件设备等。文件描述符是这样做的基本手段。

为什么我不能说嘿,我想写入标准输入或标准输出?

显然,根据上下文,您可以。在 C 中,这些(表面上)是返回到相应低级描述符的宏(看看stdio.h......)。如果它让你 WRT shell 出错,你总是可以,例如:

export stdin=0
export stdout=1
Run Code Online (Sandbox Code Playgroud)

尽管这可能不是一个很好的主意,因为您可能会以某些可能不幸的方式在全局命名空间中受到踩踏。此外,输入stdin所需的时间比0;) 长。