handle

来源:互联网 发布:淘宝店铺排名靠前 编辑:程序博客网 时间:2024/06/02 10:14

以前貌似在java代码里看到过这个词,但是太久远了,丝毫印象没有。今天看到StreamHandle,理解是定位这个流的东东,但是忽然对Handle开始感兴趣了起来,于是上网搜搜,呵呵……

 

从用户(操作系统调用的用户,程序员)的角度来看,最好的理解是对进程中打开/使用的系统对象(如:文件)的索引,也就是说, 通过Handle,可以找到打开/使用的系统对象的一些状态信息(如:文件的访问权限等)。对程序员来说,知道handle于进程打开对象的一一对应关系就足够了。

 

那就是说有了StreamHandle,就可以定位这个流了。

 

但是Handle并不是直接做为指针或索引的来访问程序的(事实上,由于handle指向/索引的内存存在于系统空间内,这种访问方法也没有任何可行性)。Handle本身隐藏了系统的内部实现,也就是说,系统可以选择使用指针或索引来实现系统的handle,而且这种改变将不会对应用程序造成任何影响。可以想象以下C语言中的文件使用:我们通常定义了一个FILE结构的指针,然后使用一组函数操作它(fread/fopen/fwrite),但我们极少(或者说不建议)直接访问FILE结构的成员,这样,即使C语言的实现中改变了FILE结构,也不会影响到我们的程序,Handle也是同样道理。


事实上,不同的系统也确实使用了不同的Handle类型,甚至不同的对象索引表的数据结构。

WindowsNT4.0中,打开对象连续存放在一张表中(结构数组),Handle是进程打开对象在这张表中相对表首的偏移量(即非指针叶非索引);而在Windows2K中,对象表采用了三重索引结构,Handle则更接近于对象的索引(这种转化要一些简单的计算)。 (这个例子其实我不太了解,呵呵)


这个很重要:Handle和对象表是一个进程的私有财产(包括所谓进程Handle),当子进程创建时,系统会把设有继承属性的Handle复制到子进程的对象表中。所以,在进程之间简单的传递Handle的值是完全没有意义的。进程号则是系统为一个进程指定的唯一识别号。

 

原创粉丝点击