在尝试学习套接字编程时,我看到了以下代码:
int sock; sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
我浏览了手册页,发现套接字返回一个文件描述符。我试着在互联网上搜索和其他类似的问题,但我不能理解什么是文件描述符。如果有人能用简单的语言解释文件描述符,那就太好了。
uxhixvfz1#
有两个相关对象:file descriptor 和file description。人们经常混淆这两者,认为它们是相同的。File descriptor 是应用程序中的整数,它引用内核中的文件 description。文件 * 描述 * 是内核中维护打开文件状态的结构(当前位置、阻塞/非阻塞等)。在Linux中,文件 * 描述 * 是struct file。POSIX open():open()函数应在文件和文件 * 描述符 * 之间建立连接。它应创建引用文件的打开文件 * 描述符 * 和引用该打开文件 * 描述符 * 的文件 * 描述符 *。其他I/O函数使用文件描述符引用该文件。路径参数指向命名文件的路径名。open()函数应返回指定文件的文件描述符,该文件描述符是当前未打开的最低文件描述符。打开的文件描述符是新的,因此文件描述符不应与系统中的任何其他进程共享。
struct file
open()
r6l8ljro2#
在Unix/ Linux操作系统中,文件描述符是抽象指示符用于访问文件或其他IO的(句柄)(输入/输出)资源,如管道或网络套接字。通常,文件描述符索引到由Linux/Unix操作系统内核维护的每个进程文件描述符表中,然后索引到由所有进程打开的全系统文件表中。调用文件表。此表记录了文件或其他资源在以下操作中打开的“模式”(还有更多操作)
它还索引到第三个表中,称为inode表,该表描述了实际的底层文件。
4c8rllxm3#
文件描述符只不过是到文件的Map,你也可以说它们是指向进程正在使用的文件的指针。FD只是充当进程资源指针的整数值。每当一个进程启动时,运行进程的条目会被添加到/proc/<pid>目录中。这是保存所有与进程相关的数据的地方。此外,在进程启动时,内核会分配3个文件描述符给进程,用于与3个数据流(称为stdin、stdout和stderr)进行通信。Linux内核使用一种算法来总是创建具有最小可能整数值的FD,因此这些数据流被Map到数字0、1和2。假设在代码中打开了一个文件进行读写操作,这意味着进程需要访问一个资源,并且必须为这个新资源创建一个Map/指针。为此,只要代码打开文件,内核就会自动创建一个FD。如果您运行ls -l /proc/<pid>/fd/,您将看到在那里创建的一个ID为4的附加FD(如果程序使用了其他资源,也可以是其他数字)
/proc/<pid>
stdin
stdout
stderr
0
1
2
ls -l /proc/<pid>/fd/
4
vqlkdk9b4#
我认为文件描述符是指向内核维护的不透明文件对象的(间接的、更高级的)* 指针 *。通常,当你处理由库维护的对象时,你传递给库的指针指向那些你不应该自己去解引用和操作的对象。对于内核对象来说,这不仅仅是你不能自己操作它们-,你确实不能,因为它们位于不同的地址空间,你根本无法访问它们,因为它们位于不同的地址空间,指针不是一种有意义的引用它们的方式。你需要一个令牌或句柄,内核会在内部将其解析为一个在内核地址空间中有意义的指针,文件描述符就是这样的整数形式的令牌。对于内核:
your_process_id + your_file_descriptor => kernels_file_object_pointer
(or如果给定的文件描述符可能无法解析为给定进程的文件对象指针,则显示 EBADF 错误)
ocebsuys5#
File descriptor
过程。
File description
I-Node table
5条答案
按热度按时间uxhixvfz1#
有两个相关对象:file descriptor 和file description。人们经常混淆这两者,认为它们是相同的。
File descriptor 是应用程序中的整数,它引用内核中的文件 description。
文件 * 描述 * 是内核中维护打开文件状态的结构(当前位置、阻塞/非阻塞等)。在Linux中,文件 * 描述 * 是
struct file
。POSIX open():
open()
函数应在文件和文件 * 描述符 * 之间建立连接。它应创建引用文件的打开文件 * 描述符 * 和引用该打开文件 * 描述符 * 的文件 * 描述符 *。其他I/O函数使用文件描述符引用该文件。路径参数指向命名文件的路径名。open()
函数应返回指定文件的文件描述符,该文件描述符是当前未打开的最低文件描述符。打开的文件描述符是新的,因此文件描述符不应与系统中的任何其他进程共享。r6l8ljro2#
在Unix/ Linux操作系统中,文件描述符是抽象指示符用于访问文件或其他IO的(句柄)(输入/输出)资源,如管道或网络套接字。通常,文件描述符索引到由Linux/Unix操作系统内核维护的每个进程文件描述符表中,然后索引到由所有进程打开的全系统文件表中。调用文件表。此表记录了文件或其他资源在以下操作中打开的“模式”(还有更多操作)
它还索引到第三个表中,称为inode表,该表描述了实际的底层文件。
4c8rllxm3#
文件描述符只不过是到文件的Map,你也可以说它们是指向进程正在使用的文件的指针。
FD只是充当进程资源指针的整数值。
每当一个进程启动时,运行进程的条目会被添加到
/proc/<pid>
目录中。这是保存所有与进程相关的数据的地方。此外,在进程启动时,内核会分配3个文件描述符给进程,用于与3个数据流(称为stdin
、stdout
和stderr
)进行通信。Linux内核使用一种算法来总是创建具有最小可能整数值的FD,因此这些数据流被Map到数字
0
、1
和2
。假设在代码中打开了一个文件进行读写操作,这意味着进程需要访问一个资源,并且必须为这个新资源创建一个Map/指针。
为此,只要代码打开文件,内核就会自动创建一个FD。
如果您运行
ls -l /proc/<pid>/fd/
,您将看到在那里创建的一个ID为4
的附加FD(如果程序使用了其他资源,也可以是其他数字)vqlkdk9b4#
我认为文件描述符是指向内核维护的不透明文件对象的(间接的、更高级的)* 指针 *。
通常,当你处理由库维护的对象时,你传递给库的指针指向那些你不应该自己去解引用和操作的对象。
对于内核对象来说,这不仅仅是你不能自己操作它们-,你确实不能,因为它们位于不同的地址空间,你根本无法访问它们,因为它们位于不同的地址空间,指针不是一种有意义的引用它们的方式。
你需要一个令牌或句柄,内核会在内部将其解析为一个在内核地址空间中有意义的指针,文件描述符就是这样的整数形式的令牌。
对于内核:
(or如果给定的文件描述符可能无法解析为给定进程的文件对象指针,则显示 EBADF 错误)
ocebsuys5#
File descriptor
是与打开的文件相关联的数字。File descriptor
表中的索引号或条目号。File descriptor
表是每个进程的,但可以在过程。
File descriptor
表中的条目具有指向File description
表中条目的指针,该表是系统范围的。File description
表中的条目包含有关文件的实际数据:文件的 * 访问模式 、 偏移量 * 和 * 状态标志 *,以及指向I-Node table
中的条目的指针,其中I-Node table
中的条目保存关于文件在存储介质上的实际位置的信息(块号)。