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

今天学习Android,看到一个unix函数不明白,但返回值是handle,查了查意思,是句柄的意思,那什么是句柄呢,从网上搜了一些答案,觉得这篇文章比较好,个人认为比wiki的都要讲的好。简而言之,句柄是一种抽象的思想:

隐藏了内核实现的细节

同时为调用提供了方便

保证了内核的安全

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

然后,指针其实也是一种"句柄",只是由于指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——所以,通常不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的作用,这不是句柄又是什么?

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

暴露了内核对象本身,使得程序(而不是操作系统内核)也可以任意地修改对象地内部状态(首地址都知道了,还有什么不能改的?),这显然是操作系统内核所不允许的;

操作系统有定期整理内存的责任,如果一些内存整理过一次后,对象被搬走了怎么办?

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

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

Handle在Windows中的含义很广泛,以下关于谈到的Handle除非特别说明,将仅限于进程、线程的上下文中。

1、先来谈谈Handle

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

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

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

2、进程ID

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

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

3、HINSTANCE

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

原文:http://blog.chinaunix.net/uid-26285146-id-3262293.html

mysql句柄是什么_什么是句柄?为什么会有句柄?HANDLE相关推荐

  1. vc 通过句柄修改窗口大小_漫画:对象是如何被找到的?句柄 OR 直接指针?

    小贴士:想要使用并定位 Java 对象,就要用到 Java 虚拟机栈(Java Virtual Machine Stack),它描述的是 Java 方法执行的线程内存模型:每个方法被执行的时候,Jav ...

  2. mysql db模块下载_易语言MySql数据库操作类V1.0模块源码

    易语言MySql数据库操作类V1.0模块源码 易语言MySql数据库操作类V1.0模块源码 系统结构:MySql数据库连接类_测试子程序,置连接选项,连接,关闭,是否已连接,取连接句柄,置连接句柄,执 ...

  3. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...

    这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...

  4. golang mysql连接池原理_[Go] golang实现mysql连接池

    golang中连接mysql数据库,需要使用一个第三方类库github.com/go-sql-driver/mysql,在这个类库中就实现了mysql的连接池,并且只需要设置两个参数就可以实现 一般连 ...

  5. java 句柄数 设置_修改操作系统句柄数和用户进程数

    对于一般的应用来说(像Apache.系统进程)1024完全足够使用.但是像squid.mysql.java等单进程处理大量请求的应用来说就有点捉襟见肘了.如果单个进程打开的文件句柄数量超过了系统定义的 ...

  6. 无法分配更多的internet句柄怎么回事_一文精通Java NIO(内容较多,无耐心者勿点)...

    本文揭示了Java NIO底层的诸多细节与使用和理解上的陷阱,对于NIO的学习非常有帮助. 本文是笔者在学习NIO过程中发现的一些比较容易让人忽略的知识的一个总结,而这些让人忽略的小细节恰恰是NIO网 ...

  7. 得到选择框句柄 怎么操作_电脑版微信怎么多开?最简单的三种电脑版微信多开教程...

    ​在现实中的我们在网络上却又很多张脸,多开微信很多人都是需要的,这里就介绍3个方法给大家多开. 方法1:BAT文件 鼠标右键单击微信图标选择 属性 在属性选项夹内复制 "目标"例如 ...

  8. matlab 函数句柄@的介绍_什么是函数句柄(转)

    http://blog.csdn.net/kevinhg/article/details/8861774 http://www.ilovematlab.cn/thread-30375-1-1.html ...

  9. 基于labview的控件句柄_关于labview同步中的引用句柄

    问:在学习LABVIEW8.2的examplegeneral下的关于通知器的例子程序时,发现有一个主?VI向子VI传递通知句柄.在子VI中我不知道怎样设置通知引用句柄.在LABVIEW的前面板的图标中 ...

  10. java 句柄数 设置_技术文档(2)--Linux 句柄数设置情况,问题:java.io.IOException: Too many open files...

    打开的文件过多,一般来说是由于应用程序对资源使用不当造成,比如没有及时关闭Socket或数据库连接等.但也可能应用确实需要打开比较多的文件句柄,而系统本身的设置限制了这一数量. 第一个异常在错误影响到 ...

最新文章

  1. JSP学习——语法(二)
  2. Hibernate二级缓存的使用
  3. Java黑皮书课后题第11章:11.1(Triangle类)设计一个名为Triangle的类来继承GeometricObject类。该类包括:
  4. 3、oracle数据库的语法基础
  5. LeetCode 1773. 统计匹配检索规则的物品数量
  6. JS基础入门篇(四)—this的使用,模拟单选框,选项卡和复选框
  7. Spring_day4
  8. Maven中DependencyManagement和Dependencies区别
  9. 详解将FTP映射至Windows
  10. 微信网页版打不开怎么办?这里有官方解决办法!
  11. HTML:设置背景颜色和图片
  12. C++实现打飞机小游戏(源代码)
  13. vue单文件组件中引用其他组件
  14. 皓月酒店管理系统: Jquery + Servlet + Mybatis
  15. 微信麻将连接服务器失败,微乐麻将授权失败是怎么回事?微乐麻将怎么用微信登录?...
  16. 知道你的成绩单是怎么打印的吗?超长Excel表格1页打印,拯救A4纸
  17. 领导提拔你,还是干掉你,从来都不是看能力!
  18. mp4视频分片生成m3u8流文件并加密
  19. 将MongoDB添加到windows服务中
  20. Fiddler抓包工具保姆级使用教程(超详细)

热门文章

  1. 吴恩达深度学习——编程1
  2. wget下载nessus
  3. 大学python教材课后答案_大学慕课2020年Python编程基础课后答案
  4. MATLAB学习之均值滤波
  5. 外螺纹对照表_最新英制螺纹对照表(2016年完整版).
  6. 方法论 | 多因子策略的五大讨论(思维导图收藏版)
  7. dcs world f15c教学_烟台TSXP57353M【四点零自动化】DCS系统
  8. 自制 arduino 音符频率对照表(音符在arduino里对应的值)
  9. python 爬取种子_Python开发实例分享bt种子爬虫程序和种子解析
  10. 云信api_服务端API文档