2016-11-29 163 views
0

虽然努力学习socket编程,我看到了下面的代码:什么是文件描述符?

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

我通过man页面浏览和发现套接字返回一个文件描述符。我试过在这里搜索互联网和其他类似的问题,但我不明白什么文件描述符是真的。我必须在两天内完成我的套接字编程课程。所以如果有人能用简单的语言解释文件描述符,那会很棒。

+0

建议阅读结构化引入复杂的主题,如网络编程。如果您能买得起一本书或可以访问一个图书馆,请阅读史蒂文斯在UNIX环境下的高级编程。*如果您执行了大量的网络编程,请查看他的网络编程书籍。手册页作为参考很有用,但对于获得整体想法很不利。 –

回答

2

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

文件描述符是您的应用程序中的一个整数,指的是内核中的文件描述

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

POSIX open()

open()功能应建立文件和文件描述之间的连接。它将创建一个打开的文件描述指的是一个文件和一个文件描述符它指的是打开文件描述。文件描述符被其他I/O函数用来引用该文件。 path参数指向命名文件的路径名。

open()函数应该返回一个指定文件的文件描述符,该文件描述符是该进程当前未打开的最低文件描述符。打开的文件描述是新的,因此文件描述符不应与系统中的任何其他进程共享。

0

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

  • 阅读
  • 附加

以及其他可能的模式。 它还会索引到第三个称为inode表的表中,该表描述实际的底层文件。

1

我认为文件描述符为(间接的,更高级的)指针为内核维护的不透明文件对象。

通常情况下,当您处理由库维护的对象时,会将库指针传递给您不应该解除引用和操纵自己的对象。

对于内核对象,这不仅仅是因为你不应该自己操纵它们 - 你实际上不能这样做,因为它们生活在一个根本不可访问的地址空间中。而且由于他们生活在不同的地址空间,指针并不是引用它们的有意义的方式。

您需要一个令牌或句柄,内核将内部解析为一个在内核地址空间中有意义的指针。文件描述符是整数形式的这种令牌。

对于内核:

your_process_id + your_file_descriptor => kernels_file_object_pointer 

(或EBADF错误,如果一个给定的文件描述符可以不被解析为一个文件对象指针对于给定的过程)