神马是内核对象

内核对象有非常多的种类,例如:事件对象、文件对象、文件内存映射对象、互斥量对象等等。这些对象是由操作系统去管理的。

内核对象通常都会被多个进程共用。系统为了记录内核对象的引用情况,于是有了内核对象的引用计数。通过计数就能知道内核对象是否被访问使用。

由于内核对象是共用的,为它们设立安全描述信息就显得很有必要了。因为要记录它是属于谁的、那些组属的可以访问、哪些被禁止访问。一般是谁创建它,内核对象就属于谁。

每个进程都有一个内核句柄表,这个句柄表记录了本进程创建的或者继承的句柄,如下面的图

内核句柄表

通过句柄我们能够定位到内存的内核对象。而这里的句柄是跟线程相关的,句柄的值通常是索引值的4倍值。由于句柄是线程相关的,所以进程的句柄不能传递给另外的进程访问。因为传递的是个索引值,而这个索引值在其它的进程有可能对应别的内核对象。

因为进程内的句柄是线程相关的,那么是不是进程间就无法传递内核对象了呢?

答案是有办法,但是肯定不是简单的传递内核对象句柄。

这里提供了三种方法进程内核对象共享

  1. 使用对象句柄继承

    这个方法只使用与父进程创建子进程过程中的句柄传递。系统会在父进程创建子进程的时候把父进程
    句柄表中设置了继承属性的句柄完完整整的复制一份到子进程。上面图中的四个项都完全相同。这样
    父子进程中传递的句柄值就能够正确访问相同的内核对象了。
    
  2. 为对象命名

    使用这种方法不要求父子进程的情景。可以使用与任何进程之间。关键在于给内核对象设定了一个
    名字,这个名字将作为对象的索引。但是系统没有保证这个名字唯一的机制。所以命名什么的要独特一点。 
    
  3. 复制对象句柄

    这种方法是三个进程的游戏。把A的某个内核对象拷贝到B中要C来完成。
    

watermelon
179 声望7 粉丝

小技能:C++,Python,Sqlite,WTL,Linux,Nginx,Windows,MFC