首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件描述符和文件句柄(和C)

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

Stack Overflow用户
提问于 2015-11-05 03:17:30
回答 1查看 4.8K关注 0票数 9

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

根据我从Wikipedia收集的信息,文件描述符是文件描述符表中的索引,它指向文件表中的文件名,而后者又指向inode表中的inode。文件句柄是一种存储文件描述符的数据结构类型。

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-05 13:23:24

首先,我们需要独立的接口和实现。在POSIX一致性系统上,您可以获得int作为open(2)的结果,然后您可以使用这个int进行写入、读取等操作。这是界面。

在为具体进程管理开放文件的内核中,从int映射到内核用于管理文件的某种结构,可以通过多种方式实现,可以是数组,也可以是二叉树等。

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

返回CreateFile的文件句柄以类似于文件描述符的方式使用,它是整数,用来作为索引在每个处理表中访问struct file的Windows模拟。

因此,我认为文件句柄和文件描述符可以用作同义词,但通常是在谈到file handle平均句柄时,以及在谈论文件描述符时讨论open返回的POSIX句柄。在用于管理事件、GUI窗口等的windows HANDLE上,POSIX系统上的file descriptors不是这样的,但是在POSIX系统中,file descriptors也用来管理套接字,而在windows上,这在winsock 2之前是不可能的。

还有关于文件。文件位于file descriptorfile handle之上的接口中,它的内部有一个文件,加上一些用于管理缓冲I/O的数据,例如来自流行的linux运行时glibc的数据:

代码语言:javascript
复制
struct _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;
//...
};

如您所见,它有_fileno,它是glibc通过open(2)调用从操作系统获得的。但它有很多东西可以缓冲,翻译行尾等。

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

https://stackoverflow.com/questions/33536061

复制
相关文章

相似问题

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