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

问题描述:

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

从我从*收集的信息来看,文件描述符是文件描述符表中的一个索引,它指向文件表中的文件名,该文件名又指向inode表中的inode。文件句柄是一种存储文件描述符的数据结构。

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

在C通常我们讲的描述符和流:http://www.gnu.org/software/libc/manual/html_node/Descriptors-and- Streams.html#描述符和数据流 –

+0

查看描述符和数据流--http://www.gnu.org/software/libc/manual/html_node/Streams-and-File-Descriptors.html – ameyCU

首先我们需要单独的接口和实现。 在符合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指处理,而当谈 文件描述符谈论POSIX int回报的open。在Windows HANDLE还可以用来管理事件,GUI窗口等, 这不是file descriptors在POSIX系统,但 真正的POSIX系统file descriptors还可以用来管理插座, 而上,这是不可能的窗口,直到Winsock 2的。

关于FILE。 接口上面的文件file descriptorfile handle, 它有一个里面,加上一些数据来管理缓冲的I/O。 例如从流行的Linux C运行时的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,它file descriptorglibc通过open(2)调用从OS获得。但它有很多东西来缓冲,翻译行尾等。