什么是句柄?为何会有句柄?HANDLE

什么是句柄?为何会有句柄?HANDLEwindows

 原文:http://blog.csdn.net/liquanhai/article/details/5849172ide

关键字:句柄, HANDLE, WINDOWS SDK, windows.h, 函数

   从广义上,可以从一个数值拎起一大堆数据的东西均可以叫作句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句柄",其实仍是个"柄"。从一个小东西拎起一大堆东西,这难道不像是个"柄"吗? spa

而后,指针其实也是一种"句柄",只是因为指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——因此,一般不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的做用,这不是句柄又是什么? 操作系统

Windows系统中有许多内核对象(这里的对象不彻底等价于"面向对象程序设计"一词中的"对象",虽然实质上还真差很少),好比打开的文件,建立的线程,程序的窗口,等等。这些重要的对象确定不是4个字节或者8个字节足以彻底描述的,他们拥有大量的属性。为了保存这样一个"对象"的状态,每每须要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?固然传递这些对象的首地址是一个办法,但这至少有两个缺点: .net

  1. 暴露了内核对象自己,使得程序(而不是操做系统内核)也能够任意地修改对象地内部状态(首地址都知道了,还有什么不能改的?),这显然是操做系统内核所不容许的;
  2. 操做系统有按期整理内存的责任,若是一些内存整理过一次后,对象被搬走了怎么办?

因此,Windows操做系统就采用进一步的间接:在进程的地址空间中设一张表,表里头专门保存一些编号和由这个编号对应一个地址,而由那个地址去引用实际的对象,这个编号跟那个地址在数值上没有任何规律性的联系,纯粹是个映射而已。 线程

在Windows系统中,这个编号就叫作"句柄"。 翻译

 

Handle在Windows中的含义很普遍,如下关于谈到的Handle除非特别说明,将仅限于进程、线程的上下文中。 设计

一、先来谈谈Handle 指针

Handle自己是一个32位的无符号整数,它用来表明一个内核对象。它并不指向实际的内核对象,用户模式下的程序永远不可能得到一个内核对象的实际地址(通常状况下)。那么Handle的意义何在?它其实是做为一个索引在一个表中查找对应的内核对象的实际地址。那么这个表在哪里呢?每一个进程都有这样的一个表,叫句柄表。该表的第一项就是进程本身的句柄,这也是为何你调用GetCurrentProcess()老是返回0x7FFFFFFF缘由。

简单地说,Handle就是一种用来"间接"表明一个内核对象的整数值。你能够在程序中使用handle来表明你想要操做的内核对象。这里的内核对象包括:事件(Event)、线程、进程、Mutex等等。咱们最多见的就是文件句柄(file handle)。

另外要注意的是,Handle仅在其所属的进程中才有意义。将一个进程拥有的handle传给另外一个进程没有任何意义,若是非要这么作,则须要使用DuplicateHandle(),在多个进程间传递Handle是另一个话题了,与这里要讨论的无关。

二、进程ID

首先,进程ID是一个32位无符号整数,每一个进程都有这样的一个ID,而且该ID在系统范围内是惟一的。系统使用该ID来惟一肯定一个进程。

深刻些说,系统可能使用进程ID来计算表明该进程的内核对象的基地址(及EPROCESS结构的基地址),具体的计算公式你能够去问微软的OS开发人员。

三、HINSTANCE

HINSTANCE也是一个32无符号整数,它表示程序加载到内存中的基地址。

相关文章
相关标签/搜索