句柄和文件描述符的概念
- 句柄是Windows下的概念。句柄是Windows下各种对象的标识符,比如文件(也许叫文档比较合适一点)、资源、菜单、光标、位图等。文件句柄和文件描述符类似,它也是一个非负整数,也用于定位文件数据在内存中的位置。
- 由于linux下所有东西都被看成是文件,比如文件(也许叫文档比较合适一点)、目录、进程、网络socket、各种硬件设备等,所以linux下的文件描述符其实就相当于windows下的句柄。文件句柄只是windows众多句柄中的一种类型而已。
- 可以这么说:句柄是指向指针的指针。句柄指向的空间稳定,这个稳定的空间存放着不稳定的地址,Windows内存管理器经常在内存中来回移动对象,这些对象的地址经常变化,但把这些变化的地址存放到不变的句柄地址空间里,就可以通过句柄确定这些对象了。
详细的看下面的两个回答:
https://blog.youkuaiyun.com/perfectguyipeng/article/details/71189822
https://blog.youkuaiyun.com/wenzhou1219/article/details/17659485
文件描述符(file descriptor)
对于linux而言,所有对设备和文件的操作都使用文件描述符来进行的。文件描述符是一个非负的整数,它是一个索引值,指向内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。
通常,一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理。这3个文件分别对应文件描述符为0、1和2(宏STD_FILENO、STDOUT_FILENO和STDERR_FILENO)。
每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。系统为每一个进程维护了一个文件描述符表,该表的值都是从0开始的,所以在不同的进程中你会看到相同的文件描述符,这种情况下相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。具体情况要具体分析,要理解具体其概况如何,需要查看由内核维护的3个数据结构。
https://my.oschina.net/iuranus/blog/330397
进程级的文件描述符表
系统级的打开文件描述符表
文件系统的i-node表
文件句柄 vs 文件描述符
- 文件句柄也称为文件指针(FILE *):C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。
- 文件描述符本质是一个索引号(非负整数),系统用户层可以根据它找到系统内核层的文件数据,即文件描述符是文件描述符表的一个索引,。这是一个POSIX标准下的概念,常见于类Unix系统,比如linux。windows也是声称遵循POSIX标准的,所以windows也有文件描述符这个概念,但不常用。