什么是文件描述符? 为什么我们需要它们?
答案1
文件描述符是表示进程中打开的文件的数字。这是程序记住它正在操作哪个文件的一种方式。打开文件会查找空闲编号并将其分配给该进程的文件描述符表中的文件;关闭文件将从进程描述符表中删除该条目。文件描述符之间没有关系n一个进程中的文件描述符和另一个进程中具有相同编号的文件描述符。
“每个文件都有三个(stdin、stdout、stderr)”是无稽之谈。流程有文件描述符,而不是文件。进程通常可以拥有三个以上的文件描述符,也可以拥有更少的文件描述符。 Stdin、stdout 和 stderr 是文件描述符 0、1 和 2 的名称,因为它们具有常规含义:stdin(标准输入)是程序应该读取用户输入的位置(如果需要),stdout(标准输出)是程序应该写入其生成的数据的位置(如果需要的话),stderr(标准错误)用于错误消息。 Stdin 和 stdout 可用于旨在在命令行上使用的程序,尤其是在管道中;我邀请你阅读连接 STDOUT 和 STDIN 是什么意思?和(更高级)一个命令如何可以有多个输出?
答案2
它们由一个 int 表示
是的,它们从零开始编号,这是计算类似类型的独特项目的常见且直接的方法。有点像运动衫。例如,一支球队中可能有多名守门员,但您知道在任何给定时刻哪个守门员在比赛,因为球队的每个成员都有唯一的编号。这是唯一的意义。
什么是文件描述符?
它指的是输入/输出导管。通常它们只是其中之一,但也可能两者兼而有之。
每个文件都有三个
一般每过程至少有三个,这是 *nix 风格操作系统的一个功能。
为什么我们需要它们?
您不需要它们,除非您想对当前进程以外的其他内容进行输入/输出。然而,在这样的过程中,“你”在“我写了这个”的意义上是抽象的,因为包括你在内的任何人都不可能有意义地使用它。进程并不是凭空存在的,它们是操作系统管理的实体,需要与其他实体交互、访问文件、硬件设备等。文件描述符是这样做的基本手段。
为什么我不能只是说嘿我想写入标准输入或标准输出?
显然,根据上下文,您可以。在 C 中,这些(表面上)是返回相应低级描述符的宏(请查看stdio.h
...)。如果它困扰你 WRT shell,你总是可以,例如:
export stdin=0
export stdout=1
虽然这很可能是这不是一个好主意,因为您有可能以某些可能不幸的方式在全局命名空间中受到攻击。而且,stdin
输入时间比0
;)要长。