什么是文件描述符,用简单的术语来解释?

  1. 与维基百科相比,什么是文件描述符更简单的描述? 他们为什么要求? 比如,以shell进程为例,它如何应用?

  2. 一个进程表是否包含多个文件描述符? 如果是,为什么?

简而言之,当您打开文件时,操作系统会创build一个条目来表示该文件并存储有关该打开文件的信息。 因此,如果在您的操作系统中打开了100个文件,那么在操作系统(内核中的某处)将会有100个条目。 这些条目用整数表示(如… 100,101,102 ….)。 这个条目号是文件描述符。 所以它只是一个整数,它唯一地表示操作系统中打开的文件。 如果你的进程打开10个文件,那么你的进程表将有10个文件描述符的条目。

同样,当你打开一个networking套接字时,它也被一个整数表示,它被称为套接字描述符。 我希望你明白。

文件描述符是用户和内核空间之间的接口中使用的不透明句柄,用于标识文件/套接字资源。 因此,当你使用open()socket() (系统调用接口到内核)的时候,你会得到一个文件描述符,它是一个整数(它实际上是一个进程u结构的索引 – 但这并不重要)。 因此,如果你想直接与内核接口,使用系统调用read()write()close()等等,你使用的句柄是一个文件描述符。

系统调用上覆盖了一层抽象层,即stdio接口。 这比基本的系统调用提供了更多的function/特性。 对于这个接口,你得到的不透明句柄是一个FILE* ,它是由fopen()调用返回的。 有许多函数使用stdio接口fprintf()fscanf()fclose() ,这些让你的生活更轻松。 在C中, stdinstdoutstderrFILE* ,在UNIX中分别映射到文件描述符02

从马嘴听:APUE(Richard Stevens)。
对于内核,所有打开的文件都由文件描述符引用。 文件描述符是一个非负数。
当我们打开一个已经存在的文件或者创build一个新文件时,内核返回一个文件描述符给进程。 内核维护一个正在使用的所有打开文件描述符的表格。 文件描述符的分配通常是连续的,它们被分配给文件,作为来自空闲文件描述符池的下一个空闲文件描述符。 当我们closures文件时,文件描述符被释放,并可用于进一步的分配。
看到这个图像的更多细节:
两个过程

当我们要读取或写入文件时,我们使用由open()create()函数调用返回的文件描述符来标识文件,并将其用作read()write()的参数
按照惯例,UNIX系统shell将文件描述符0与进程的标准input ,具有标准输出的文件描述符1以及具有标准错误的文件parsing器2相关联。
文件描述符的范围是从0到OPEN_MAX。
有关更多信息,请参阅APUE Book的第3章。

作为对其他答案的补充,unix将所有内容视为文件系统。 你的键盘是一个只能从内核读取的文件。 该屏幕是只写文件。 同样,文件夹,input输出设备等也被认为是文件。 无论何时打开一个文件,当设备驱动程序[设备文件]请求open(),或者进程打开用户文件时,内核分配一个文件描述符,一个整数,指定对该文件的访问, ,只写等[供参考: https : //en.wikipedia.org/wiki/Everything_is_a_file ]

关于文件描述符的更多要点

  1. 文件描述符(FD)是非负整数(0,1,2,…),与打开的文件关联。

  2. 0,1,2是标准的FD,它们对应于STDIN_FILENO,STDOUT_FILENO和STDERR_FILENO。 (在unistd.h中定义)在程序启动时默认以shell的名义打开。

  3. FD按顺序分配,意味着可能的最小未分配整数值。

  4. 特定进程的FD可以在/ proc / $ pid / fd中看到(在基于Unix的系统上)

任何操作系统都有进程(p)正在运行,比如p1,p2,p3等等。 每个进程通常会持续使用文件。

每个进程由一个进程树(或另一个进程中的进程表)组成。

通常,操作系统通过一个数字 (也就是说,在每个进程树/表中)来表示每个进程中每个文件

在这个过程中使用的第一个文件是file0 ,第二个是file1 ,第三个是file2 ,等等。

任何这样的数字是一个文件描述符。

文件描述符通常是整数(0,1,2而不是0.5,1.5,2.5)。

考虑到我们经常将进程描述为“进程表”,并且考虑到表具有行(条目),我们可以说每个条目中的文件描述符单元用来表示整个条目。

以类似的方式,当你打开一个networking套接字时,它有一个套接字描述符。

在某些操作系统中,可能会耗尽文件描述符,但是这种情况非常less见,普通计算机用户不应该担心。

文件描述符可能是全局的(进程A从0开始,结束于1;进程B开始说2,结束于3)等等,但据我所知,通常在现代操作系统中,文件描述符不是全局的,并且实际上是特定于进程的(进程A开始于0,结束于5,而进程B开始于0,结束于10)。