有人可以准确地向我解释文件描述符和文件句柄之间的区别(与Windows的术语定义不同;我对他们的定义感到好奇,但这需要更长的答案)?
根据我从维基百科收集的内容,文件描述符是文件描述符表中的索引,它指向文件表中的文件名,该文件名又指向inode表中的inode。文件句柄是一种存储文件描述符的数据结构。
答案 0 :(得分:3)
首先,我们需要单独的界面和实现。
在POSIX符合系统上,int
和open(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 handle
和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;
//...
};
上方的界面中的文件,
它有一个内部,加上一些数据来管理缓冲的I / O.
例如来自流行的Linux C运行时glibc:
_fileno
正如您所看到的那样file descriptor
,glibc
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'
}
]
}
。但它有很多东西要缓冲,翻译行尾等等。