内核对象句柄表的疑问--关于跨进程共享内核对象的问题

dwen20 2008-08-03 10:39:59
我们知道跨进程共享内核对象有三种方式:
1.对象句柄继承
2.对象命名
3.对象句柄拷贝

为什么用继承方式时,子进程内核对象句柄表中内核对象句柄不仅所有值与父进程中的一样,而且
表项位置也要一样?(对于那些被共享的句柄而言)

而用对象命名方式的时候,如果进程A已经创建一个内核对象名为objectname,那么当进程B调用Create*(...,TEXT("objectname"))函数时,如果一切顺利,“系统在新进程的句柄表中找出一个空项目,并对该项目进行初始化,使
该项目指向现有的内核对象”,也就是objectname了,但后面又强调
“请注意,这两个进程中的句柄值很可能是不同的值。这是可以的。Process A将使用它的句柄值,而Process B 则使用它自
己的句柄值来操作一个互斥内核对象。”

这使我很费解,既然命名对象方式时可以这么做,为什么对象句柄继承方式中非要一模一样不可呢?
请高人指点指点。
...全文
292 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dwen20 2008-08-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zencher 的回复:]
对象句柄继承时,并不是说要刻意的一模一样的

因为对象句柄继承时,是在一个父进程创建一个子进程,并设置这个子进程能够继承自己的句柄,所以这个操作是在子进程创建时建立的,而且子进程应该还没有什么其他的句柄项目,所以就直接复制了,最省事的方法
[/Quote]
貌似大哥没有理解我的意思啊,我是说继承方式中需要共享的句柄不仅其句柄表项内容一致,而且所在句柄表的位置(索引)也一致。
而对象命名方式中不做这个要求,不仅不需要位置一致,甚至连表项内容都可以不一致。

为什么两种方式不同?各自的目的又是什么?呵呵
stivenjia 2008-08-07
  • 打赏
  • 举报
回复
这个还真不了解,始终不了解ms弄个这个句柄继承有什么实际意义具体是为了解决什么问题而产生的
zencher 2008-08-07
  • 打赏
  • 举报
回复
对象句柄继承时,并不是说要刻意的一模一样的

因为对象句柄继承时,是在一个父进程创建一个子进程,并设置这个子进程能够继承自己的句柄,所以这个操作是在子进程创建时建立的,而且子进程应该还没有什么其他的句柄项目,所以就直接复制了,最省事的方法
wshcdr 2008-08-07
  • 打赏
  • 举报
回复
MK
dwen20 2008-08-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zencher 的回复:]
使用命名对象是方便共享啊,Open*, Create*后还是要用句柄的嘛

不管那种继承,最终都是会给进程的句柄表中添加一个项目,只是这个这个项目获得的方法不同而已。

和你讨论了一下,我现在的理解反倒比以前加深了。
[/Quote]
恩,一同探讨吧,这本Windows核心编程着实不错,得好好学习学习。
zencher 2008-08-07
  • 打赏
  • 举报
回复
不管那种共享方式,最终都是会给进程的句柄表中添加一个项目,只是这个这个项目获得的方法不同而已。
zencher 2008-08-07
  • 打赏
  • 举报
回复
使用命名对象是方便共享啊,Open*, Create*后还是要用句柄的嘛

不管那种继承,最终都是会给进程的句柄表中添加一个项目,只是这个这个项目获得的方法不同而已。

和你讨论了一下,我现在的理解反倒比以前加深了。
dwen20 2008-08-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zencher 的回复:]
我也是刚看的Windows核心编程不久

我的理解是,句柄继承,要达到的目的是父进程的句柄传给子进程后也能使用,所以索引要一样,因为句柄值就是索引值嘛。实现这个的方法就是我上面说的那样。

而命名对象之后,系统是通过对象名称来定位对象的,系统内核来维护这个名称和对象的映射关系,所以没有必要要求索引值也一样。[/Quote]
不知道这句红色表明的语句是否也是一种可能,不过如果句柄值就是索引值的话(虽然书上这么说),红色注明的这句倒是有点矛盾了,因为这时仍然是通过句柄来访问对象的啊。除非通过Open*(... , pszName)和Create*(... , pszName)函数返回的句柄值并不是实际表项中的值。
唉,希望读到下面的时候可以更加明了一些。
dwen20 2008-08-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gaoteng1984 的回复:]
因为使用命名对象时,后一个进程的句柄表里对应的位置也许已经占用了。
比如:
进程B创建了10个句柄,HANDLE各是1, 2, 3, ...., 9, 10
进程A创建了一个命名对象,句柄是3。
进程B打开这个命名对象,得到一个句柄,因为3这个位置上已经有句柄了,所以不能放在3个,只能随便放在其他位置,比如11

继承的时候,因为此时子进程刚要初始化,还没有创建任何句柄,因此所有的句柄位置都是空闲的,所以可以使用父进程的句柄相…
[/Quote]
恩,有道理,不过我觉得既然可以让不同进程的句柄表中的entrys指向相同的内核对象,并且这些entrys本身就可能不同,也就没有必要再开辟继承方式中的机制了。
不知道是否用更深的用意啊,有待研究。。。
zencher 2008-08-07
  • 打赏
  • 举报
回复
我也是刚看的Windows核心编程不久

我的理解是,句柄继承,要达到的目的是父进程的句柄传给子进程后也能使用,所以索引要一样,因为句柄值就是索引值嘛。实现这个的方法就是我上面说的那样。

而命名对象之后,系统是通过对象名称来定位对象的,系统内核来维护这个名称和对象的映射关系,所以没有必要要求索引值也一样。
gaoteng1984 2008-08-07
  • 打赏
  • 举报
回复
因为使用命名对象时,后一个进程的句柄表里对应的位置也许已经占用了。
比如:
进程B创建了10个句柄,HANDLE各是1, 2, 3, ...., 9, 10
进程A创建了一个命名对象,句柄是3。
进程B打开这个命名对象,得到一个句柄,因为3这个位置上已经有句柄了,所以不能放在3个,只能随便放在其他位置,比如11

继承的时候,因为此时子进程刚要初始化,还没有创建任何句柄,因此所有的句柄位置都是空闲的,所以可以使用父进程的句柄相同的位置。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧