本文属于文摘,是我从论坛上看到一个答复得到。对windows句柄的解释很到位,很贴切。
原文摘引如下:
从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做
句柄。句柄的英文是“Handle”,本义就是“柄”,只是在计算机
科学中,被特别地翻译成“句柄”,其实还是个“柄”。从一个小
东西拎起一大堆东西,这难道不想个“柄”吗?
然后,指针其实也是一种“句柄”,只是由于指针同时拥有更
特殊的含义——实实在在地对应内存里地一个地址——所以,通常
不把指针说成是“句柄”。但指针也有着能从一个32位的值引用到
一大堆数据的作用,这不是句柄又是什么?
Windows系统中有许多内核对象(这里的对象不完全等价于“面
向对象程序设计”一词中的“对象”,虽然实质上还真差不多),
比如打开的文件,创建的线程,程序的窗口,等等。这些重要的对
象肯定不是4个字节或者8个字节足以完全描述的,他们拥有大量的
属性。为了保存这样一个“对象”的状态,往往需要上百甚至上千
字节的内存空间,那么怎么在程序间或者程序内部的子过程(函数)
之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然
会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,
但这至少有两个缺点:
1。暴露了内核对象本身,使得程序(而不是操作系统内核)
也可以任意地修改对象地内部状态(首地址都知道了,还有什么不
能改的?),这显然是操作系统内核所不允许的;
2。操作系统有定期整理内存的责任,如果一些内存整理过一
次后,对象被搬走了怎么办?
所以,Windows操作系统就采用进一步的间接:在进程的地址空
间中设一张表,表里头专门保存一些编号和由这个编号对应一个地
址,而由那个地址去引用实际的对象,这个编号跟那个地址在数值
上没有任何规律性的联系,纯粹是个映射而已。
在Windows系统中,这个编号就叫做“句柄”。
为表示对作者的尊重,作者的博客地址:http://hi.csdn.net/gumbour
windows句柄的详解
最新推荐文章于 2024-06-26 17:08:08 发布