文件描述符与文件名


Answers:


12

的全部四个/dev/fd/0/dev/stdin/proc/self/fd/0/dev/pts/2是文件名,因为是/////dev/../dev/fd//0/bin/sh/etc/fstab/fioejfoeijf,等所有但最后一个例子可能是您的机器上的现有文件的名称。文件名是可以在文件系统上指定文件的字符串。在Linux下,任何不包含空字节且最长为4096字节的字符串都是有效的文件名。其中许多名称是等效的,例如/bin/sh,等效于///bin/sh/bin/../bin/sh(假定/bin是现有目录),等等。到目前为止,我提供的所有示例都是绝对文件名;还有一些相对的文件名,它们不以a开头,/其含义取决于当前目录。

围绕文件名的术语不是通用的。有时,“文件名”是指文件的完整路径,有时是指目录条目的名称。POSIX术语是目录条目的名称为“ filename ”或“ pathname component ”,而完整路径为“ pathname ”。

文件描述符指定特定进程中的打开文件。内核为每个进程维护一个文件描述符表。文件描述符表中的每个条目都指示如果进程请求对文件描述符进行读取,写入和其他操作,该怎么办。

文件描述符可以对应于文件并具有关联的名称,但并非所有文件描述符都可以。对于这些文件,文件可以是常规文件,目录,设备文件或命名管道(也称为FIFO)(由创建的种类mkfifo);一些系统还有其他可能性,例如Unix插座和门。没有关联的命名文件的文件描述符的例子包括管道(由管道创建的管道pipe)和网络套接字

/dev/fd/0/dev/stdin/proc/self/fd/0在文件名(全部当量)用特殊的意思:他们哪个文件通过文件描述符0。当一个进程打开这些当前访问的所有候,内核副本索引为0的条目的文件描述符描述符表到一个新的描述符。打开这些文件中的任何一个都等同于调用dup(0)。命名文件是一种间接使进程使用其已打开文件之一而不是打开新文件的方法。它们对于在程序的命令行中传递有用,该程序期望文件名在此打开。


@Giles您写道:“文件描述符表中的每个条目都指示如果进程请求对文件描述符进行读取,写入和其他操作,该怎么办。”(重点是我的)。据我了解,它只是一个整数,分别类似于stdin,stdout和stderr的标准0,1,2等。对于常规文件,它将是更高价值的数字。我从您的评论中得到的不是这个数字如何表示“如果进程请求对文件描述符进行读取,写入和其他操作,该怎么办”。。您能对此做些补充吗?
极客2014年

@Geek文件描述符表中的条目不是数字。该数字是该表的索引。
吉尔斯(Gilles)'所以

@Giles感谢您澄清我的误会。我现在更好地了解了。因此,您能否在回答中举一个“做什么”部分的示例。我收集到文件描述符表中的每个条目都再次具有指向文件表的指针,该文件表包含诸如文件偏移量,文件状态等信息。
极客

2

Filename只是文件系统上文件的名称,仅此而已-它只是一个字符串。

文件描述符是某种对象,可以从中读取和/或写入。即已打开并准备好文件。不仅有文件描述符-stdin,stdout和stderr也是描述符,您可以使用与文件绝对相同的功能来读写文件(除了例如不能搜索)。不是文件的描述符的其他示例包括:命名管道和网络套接字。

在代码中,文件描述符是一个变量,它指向内核中某个表示文件对象的指针。

例如,/ dev / fd / 0,/ dev / stdin,/ proc / self / fd / 0都是到/ dev / pts / 2的链接。这是四个文件描述符还是文件名?

这些都是伪文件,对于某些脚本或程序可能有用。您可以打开它们,open()将返回一个文件描述符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.