文件描述符和文件句柄(和C)

时间:2015-11-05 03:17:30

标签: c linux file io

有人可以准确地向我解释文件描述符和文件句柄之间的区别(与Windows的术语定义不同;我对他们的定义感到好奇,但这需要更长的答案)?

根据我从维基百科收集的内容,文件描述符是文件描述符表中的索引,它指向文件表中的文件名,该文件名又指向inode表中的inode。文件句柄是一种存储文件描述符的数据结构。

  • 文件描述符只是文件描述符表中的索引 (即,索引值只是文件描述符)?
  • 或者由索引标识的文件描述符表元素是否存储文件描述符(假设索引是一个数字,它们可能是两个不同的数字)?
  • “文件句柄”只是C中存储文件描述符的FILE数据结构的术语吗?或者文件句柄是指一些其他数据结构,它存储文件描述符,与C数据结构(FILE)分开?还有什么人能告诉我文件句柄数据结构的本质吗?

1 个答案:

答案 0 :(得分:3)

首先,我们需要单独的界面和实现。 在POSIX符合系统上,intopen(2)得到int 之后,您可以使用此int进行写作,阅读等操作。 这是界面。

在管理具体流程的打开文件的内核中,从struct file映射 用于管理文件的内核可以在很多方面实现 方式,可以是数组,也可以是二叉树等。

对于linux内核,每个打开的文件都有int, 要使用int内核,必须将struct file映射到fdt->fd[fd]的地址。 它以这样简单的方式实现 - ftd,其中struct fdtable是指向fd的指针,int是文件描述符(CreateFile)(我没有描述内核如何处理多线程访问表的方法)。这是Linux内核中的当前实现。它可以在将来改变。

返回struct file的文件句柄与文件描述符方式类似, 它是整数,用作索引来访问每个进程表中file handle的Windows模拟。

所以我认为文件句柄和文件描述符可以用作同义词, 但通常在谈论int意味着处理时,以及谈论时 文件描述符谈论由open返回的POSIX HANDLE。在窗户上 file descriptors也用于管理事件,GUI窗口等, 对于POSIX系统上的file descriptors,情况并非如此,但是 在POSIX系统上file descriptor也用于管理套接字, 虽然在Windows上这是不可能的,直到winsock 2。

关于文件。 file handlestruct _IO_FILE { int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ #define _IO_file_flags _flags /* The following pointers correspond to the C++ streambuf protocol. */ /* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */ char* _IO_read_ptr; /* Current read pointer */ char* _IO_read_end; /* End of get area. */ char* _IO_read_base; /* Start of putback+get area. */ char* _IO_write_base; /* Start of put area. */ char* _IO_write_ptr; /* Current put pointer. */ char* _IO_write_end; /* End of put area. */ char* _IO_buf_base; /* Start of reserve area. */ char* _IO_buf_end; /* End of reserve area. */ /* The following fields are used to support backing up and undo. */ char *_IO_save_base; /* Pointer to start of non-current get area. */ char *_IO_backup_base; /* Pointer to first valid character of backup area */ char *_IO_save_end; /* Pointer to end of non-current get area. */ struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; //... }; 上方的界面中的文件, 它有一个内部,加上一些数据来管理缓冲的I / O. 例如来自流行的Linux C运行时glibc:

_fileno

正如您所看到的那样file descriptorglibc open(2)通过one = { "teams": [ { name: 'ABC', members: [], rooms: '0' }, { name: 'DEF', members: [], rooms: '1' } ] } 来自操作系统two = { "persons": [ { name: 'Foo', gender: 'male', room: '1' }, { name: 'Bar', gender: 'female', room: '2' } ] } 。但它有很多东西要缓冲,翻译行尾等等。