首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是文件描述符?

什么是文件描述符?
EN

Stack Overflow用户
提问于 2016-11-29 11:15:53
回答 4查看 8.7K关注 0票数 3

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

代码语言:javascript
复制
int sock;
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-29 11:24:48

有两个相关的对象:文件描述符和文件描述。人们常常把这两者混为一谈,认为它们是一样的。

文件描述符是应用程序中的整数,它引用内核中的文件描述。

文件描述是内核中维护打开文件状态(其当前位置、阻塞/非阻塞等)的结构。在Linux文件中描述的是struct file

POSIX open()

open()函数应在文件和文件描述符之间建立连接。它将创建引用文件的公开文件描述和引用该打开的文件描述的文件描述符。其他I/O函数使用文件描述符来引用该文件。path参数指向命名文件的路径名。 open()函数将返回指定文件的文件描述符,该文件描述符是当前未为该进程打开的最低文件描述符。打开的文件描述是新的,因此文件描述符不应与系统中的任何其他进程共享它。

票数 13
EN

Stack Overflow用户

发布于 2020-07-12 15:47:51

文件描述符只不过是对文件的映射。您还可以说,这些是指向进程正在使用的文件的指针。

FDs只是作为进程资源指针的整数值。

每当进程启动时,都会将正在运行的进程的条目添加到/proc/<pid>目录中。这是保存与流程相关的所有数据的地方。此外,在进程启动时,内核为进程分配3个文件描述符,以便与称为stdinstdoutstderr的3个数据流进行通信。

linux内核使用一种算法来始终创建一个具有最小整数值的FD,从而将这些数据流映射到数字012

比方说,在您的代码中,您打开了一个要读取或写入的文件。这意味着进程需要访问资源,并且必须为这个新资源创建一个映射/指针。

为此,一旦您的代码打开文件,内核就会自动创建一个FD。

如果您运行ls -l /proc/<pid>/fd/,您将使用id 4创建一个额外的FD (如果程序使用了其他资源,也可以是其他数字)。

票数 4
EN

Stack Overflow用户

发布于 2016-11-29 11:27:00

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

  • 阅读
  • 写作
  • 附加
  • 写作

可能还有其他模式。它还索引到第三个表,称为inode表,该表描述实际的基础文件。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40864527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档