我们知道跨进程共享内核对象有三种方式:
1.对象句柄继承
2.对象命名
3.对象句柄拷贝为什么用继承方式时,子进程内核对象句柄表中内核对象句柄不仅所有值与父进程中的一样,而且
表项位置也要一样?(对于那些被共享的句柄而言)而用对象命名方式的时候,如果进程A已经创建一个内核对象名为objectname,那么当进程B调用Create*(...,TEXT("objectname"))函数时,如果一切顺利,“系统在新进程的句柄表中找出一个空项目,并对该项目进行初始化,使
该项目指向现有的内核对象”,也就是objectname了,但后面又强调
“请注意,这两个进程中的句柄值很可能是不同的值。这是可以的。Process A将使用它的句柄值,而Process B 则使用它自
己的句柄值来操作一个互斥内核对象。”这使我很费解,既然命名对象方式时可以这么做,为什么对象句柄继承方式中非要一模一样不可呢?
请高人指点指点。
1.对象句柄继承
2.对象命名
3.对象句柄拷贝为什么用继承方式时,子进程内核对象句柄表中内核对象句柄不仅所有值与父进程中的一样,而且
表项位置也要一样?(对于那些被共享的句柄而言)而用对象命名方式的时候,如果进程A已经创建一个内核对象名为objectname,那么当进程B调用Create*(...,TEXT("objectname"))函数时,如果一切顺利,“系统在新进程的句柄表中找出一个空项目,并对该项目进行初始化,使
该项目指向现有的内核对象”,也就是objectname了,但后面又强调
“请注意,这两个进程中的句柄值很可能是不同的值。这是可以的。Process A将使用它的句柄值,而Process B 则使用它自
己的句柄值来操作一个互斥内核对象。”这使我很费解,既然命名对象方式时可以这么做,为什么对象句柄继承方式中非要一模一样不可呢?
请高人指点指点。
比如:
进程B创建了10个句柄,HANDLE各是1, 2, 3, ...., 9, 10
进程A创建了一个命名对象,句柄是3。
进程B打开这个命名对象,得到一个句柄,因为3这个位置上已经有句柄了,所以不能放在3个,只能随便放在其他位置,比如11继承的时候,因为此时子进程刚要初始化,还没有创建任何句柄,因此所有的句柄位置都是空闲的,所以可以使用父进程的句柄相同的位置。
不知道是否用更深的用意啊,有待研究
唉,希望读到下面的时候可以更加明了一些。