C语言 什么是文件描述符?

x8diyxa7  于 2023-03-17  发布在  其他
关注(0)|答案(5)|浏览(243)

在尝试学习套接字编程时,我看到了以下代码:

int sock;
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

我浏览了手册页,发现套接字返回一个文件描述符。我试着在互联网上搜索和其他类似的问题,但我不能理解什么是文件描述符。如果有人能用简单的语言解释文件描述符,那就太好了。

uxhixvfz

uxhixvfz1#

有两个相关对象:file descriptor 和file description。人们经常混淆这两者,认为它们是相同的。
File descriptor 是应用程序中的整数,它引用内核中的文件 description
文件 * 描述 * 是内核中维护打开文件状态的结构(当前位置、阻塞/非阻塞等)。在Linux中,文件 * 描述 * 是struct file
POSIX open()
open()函数应在文件和文件 * 描述符 * 之间建立连接。它应创建引用文件的打开文件 * 描述符 * 和引用该打开文件 * 描述符 * 的文件 * 描述符 *。其他I/O函数使用文件描述符引用该文件。路径参数指向命名文件的路径名。
open()函数应返回指定文件的文件描述符,该文件描述符是当前未打开的最低文件描述符。打开的文件描述符是新的,因此文件描述符不应与系统中的任何其他进程共享。

r6l8ljro

r6l8ljro2#

在Unix/ Linux操作系统中,文件描述符是抽象指示符用于访问文件或其他IO的(句柄)(输入/输出)资源,如管道或网络套接字。通常,文件描述符索引到由Linux/Unix操作系统内核维护的每个进程文件描述符表中,然后索引到由所有进程打开的全系统文件表中。调用文件表。此表记录了文件或其他资源在以下操作中打开的“模式”(还有更多操作)

  • 阅读
  • 书写
  • 附加
  • 书写

它还索引到第三个表中,称为inode表,该表描述了实际的底层文件。

4c8rllxm

4c8rllxm3#

文件描述符只不过是到文件的Map,你也可以说它们是指向进程正在使用的文件的指针。
FD只是充当进程资源指针的整数值。
每当一个进程启动时,运行进程的条目会被添加到/proc/<pid>目录中。这是保存所有与进程相关的数据的地方。此外,在进程启动时,内核会分配3个文件描述符给进程,用于与3个数据流(称为stdinstdoutstderr)进行通信。
Linux内核使用一种算法来总是创建具有最小可能整数值的FD,因此这些数据流被Map到数字012
假设在代码中打开了一个文件进行读写操作,这意味着进程需要访问一个资源,并且必须为这个新资源创建一个Map/指针。
为此,只要代码打开文件,内核就会自动创建一个FD。
如果您运行ls -l /proc/<pid>/fd/,您将看到在那里创建的一个ID为4的附加FD(如果程序使用了其他资源,也可以是其他数字)

vqlkdk9b

vqlkdk9b4#

我认为文件描述符是指向内核维护的不透明文件对象的(间接的、更高级的)* 指针 *。
通常,当你处理由库维护的对象时,你传递给库的指针指向那些你不应该自己去解引用和操作的对象。
对于内核对象来说,这不仅仅是你不能自己操作它们-,你确实不能,因为它们位于不同的地址空间,你根本无法访问它们,因为它们位于不同的地址空间,指针不是一种有意义的引用它们的方式。
你需要一个令牌或句柄,内核会在内部将其解析为一个在内核地址空间中有意义的指针,文件描述符就是这样的整数形式的令牌。
对于内核:

your_process_id + your_file_descriptor => kernels_file_object_pointer

(or如果给定的文件描述符可能无法解析为给定进程的文件对象指针,则显示 EBADF 错误)

ocebsuys

ocebsuys5#

  • File descriptor是与打开的文件相关联的数字。
  • 它就像File descriptor表中的索引号或条目号。
  • File descriptor表是每个进程的,但可以在

过程。

  • File descriptor表中的条目具有指向File description表中条目的指针,该表是系统范围的。
  • File description表中的条目包含有关文件的实际数据:文件的 * 访问模式 偏移量 * 和 * 状态标志 *,以及指向I-Node table中的条目的指针,其中I-Node table中的条目保存关于文件在存储介质上的实际位置的信息(块号)。

相关问题