Tim*_*Tim 13 file-descriptors filenames
我想知道文件描述符和文件名之间有什么区别和关系。他们都是用来访问文件的吗?如果是,以同样的方式?
例如,/dev/fd/0
、/dev/stdin
和/proc/self/fd/0
都是指向 的链接/dev/pts/2
。这四个是文件描述符,还是文件名?
Gil*_*il' 13
的全部四个/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 术语是“文件名”或“路径名组件”表示目录条目的名称,“路径名”表示完整路径。
文件描述符指定特定进程中打开的文件。内核为每个进程维护一个文件描述符表。文件描述符表中的每个条目都指示如果进程请求对文件描述符进行读、写和其他操作时要做什么。
文件描述符可能对应于一个文件并具有关联的名称,但并非所有描述符都具有。对于那些这样做的人,该文件可能是一个常规文件、一个目录、一个设备文件或一个命名管道(也称为 FIFO)(由 创建的类型mkfifo
);一些系统有更多的可能性,例如 Unix 套接字和门。没有关联命名文件的文件描述符的示例包括管道(由pipe
系统调用创建的类型)和网络套接字。
/dev/fd/0
,/dev/stdin
和/proc/self/fd/0
是具有特殊含义的文件名(全部等效):它们都指定当前通过文件描述符 0 访问的文件。当进程打开这些文件时,内核将文件描述符表中索引为 0 的条目复制到新的描述符. 打开这些文件中的任何一个都相当于调用dup(0)
. 命名文件是一种间接让进程使用其已打开文件而不是打开新文件的方法;它们主要用于传递程序的命令行,程序希望在命令行中打开文件名。