操作系统句柄的含义
1.句柄就是一个标识符,只要获得对象的句柄,我们就可以对对象进行任意的操作。
2.句柄不是指针,操作系统用句柄可以找到一块内存,这个句柄可能是标识符,map的key,也可能是指针,看操作系统怎么处理的了。fd算是在某种程度上替代句柄吧;Linux 有相应机制,但没有统一的句柄类型,各种类型的系统资源由各自的类型来标识,由各自的接口操作。
3.在操作系统层面上,文件操作也有类似于FILE的一个概念,在Linux里,这叫做文件描述符(File Descriptor),而在Windows里,叫做句柄(Handle)(以下在没有歧义的时候统称为句柄)。用户通过某个函数打开文件以获得句柄,此 后用户操纵文件皆通过该句柄进行。 设计这么一个句柄的原因在于句柄可以防止用户随意读写操作系统内核的文件对象。无论是Linux还是Windows,文件句柄总是和内核的文件对象相关联的,但如何关联细节用户并不可见。内核可以通过句柄来计算出内核里文件对象的地址,但此能力并不对用户开放。 下面举一个实际的例子,在Linux中,值为0、1、2的fd分别代表标准输入、标准输出和标准错误输出。在程序中打开文件得到的fd从3开始增长。 fd具体是什么呢?在内核中,每一个进程都有一个私有的“打开文件表”,这个表是一个指针数组,每一个元素都指向一个内核的打开文件对象。而fd,就是这 个表的下标。当用户打开一个文件时,内核会在内部生成一个打开文件对象,并在这个表里找到一个空项,让这一项指向生成的打开文件对象,并返回这一项的下标 作为fd。由于这个表处于内核,并且用户无法访问到,因此用户即使拥有fd,也无法得到打开文件对象的地址,只能够通过系统提供的函数来操作。 在C语言里,操纵文件的渠道则是FILE结构,不难想象,C语言中的FILE结构必定和fd有一对一的关系,每个FILE结构都会记录自己唯一对应的fd。
在[color=#066aa]程序设计 中,句柄是一种特殊的[color=#066aa]智能指针 。当一个[color=#066aa]应用程序 要引用其他系统(如[color=#066aa]数据库、[color=#066aa]操作系统 )所管理的[color=#066aa]内存 块或[color=#066aa]对象 时,就要使用句柄。句柄与普通[color=#066aa]指针 的区别在于,指针包含的是引用[color=#066aa]对象 的[color=#066aa]内存地址 ,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个[color=#066aa]内存地址 上。这种间接访问[color=#066aa]对象 的模式增强了系统对引用[color=#066aa]对象 的控制。(参见[color=#066aa]封装 )。在上世纪80年代的操作系统(如[color=#066aa]Mac OS 和[color=#066aa]Windows )的[color=#066aa]内存管理 中,句柄被广泛应用。[color=#066aa]Unix 系统的[color=#066aa]文件描述符 基本上也属于句柄。和其它[color=#066aa]桌面环境 一样,[color=#066aa]Windows API 大量使用句柄来标识系统中的[color=#066aa]对象 ,并建立操作系统与[color=#066aa]用户空间 之间的通信渠道。例如,桌面上的一个窗体由一个HWND 类型的句柄来标识。如今,[color=#066aa]内存 容量的增大和[color=#066aa]虚拟内存 算法使得更简单的[color=#066aa]指针 愈加受到青睐,而指向另一指针的那类句柄受到冷淡。尽管如此,许多[color=#066aa]操作系统 仍然把指向私有[color=#066aa]对象 的指针以及[color=#066aa]进程传递给[color=#066aa]客户端 的内部[color=#066aa]数组 下标称为句柄。