有人能准确地向我解释文件描述符和文件句柄之间的区别(这个术语与Windows的定义不同;我对它们的定义很好奇,但这需要更长的答案)吗?
根据我从Wikipedia收集的信息,文件描述符是文件描述符表中的索引,它指向文件表中的文件名,而后者又指向inode表中的inode。文件句柄是一种存储文件描述符的数据结构类型。
发布于 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 descriptor和file handle之上的接口中,它的内部有一个文件,加上一些用于管理缓冲I/O的数据,例如来自流行的linux运行时glibc的数据:
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)调用从操作系统获得的。但它有很多东西可以缓冲,翻译行尾等。
https://stackoverflow.com/questions/33536061
复制相似问题