內核對象有很是多的種類,例如:事件對象、文件對象、文件內存映射對象、互斥量對象等等。這些對象是由操做系統去管理的。segmentfault
內核對象一般都會被多個進程共用。系統爲了記錄內核對象的引用狀況,因而有了內核對象的引用計數。經過計數就能知道內核對象是否被訪問使用。安全
因爲內核對象是共用的,爲它們設立安全描述信息就顯得頗有必要了。由於要記錄它是屬於誰的、那些組屬的能夠訪問、哪些被禁止訪問。通常是誰建立它,內核對象就屬於誰。spa
每一個進程都有一個內核句柄表,這個句柄表記錄了本進程建立的或者繼承的句柄,以下面的圖操作系統
經過句柄咱們可以定位到內存的內核對象。而這裏的句柄是跟線程相關的,句柄的值一般是索引值的4倍值。因爲句柄是線程相關的,因此進程的句柄不能傳遞給另外的進程訪問。由於傳遞的是個索引值,而這個索引值在其它的進程有可能對應別的內核對象。線程
由於進程內的句柄是線程相關的,那麼是否是進程間就沒法傳遞內核對象了呢?code
答案是有辦法,可是確定不是簡單的傳遞內核對象句柄。對象
這裏提供了三種方法進程內核對象共享繼承
使用對象句柄繼承索引
這個方法只使用與父進程建立子進程過程當中的句柄傳遞。系統會在父進程建立子進程的時候把父進程 句柄表中設置了繼承屬性的句柄完完整整的複製一份到子進程。上面圖中的四個項都徹底相同。這樣 父子進程中傳遞的句柄值就可以正確訪問相同的內核對象了。
爲對象命名遊戲
使用這種方法不要求父子進程的情景。可使用與任何進程之間。關鍵在於給內核對象設定了一個 名字,這個名字將做爲對象的索引。可是系統沒有保證這個名字惟一的機制。因此命名什麼的要獨特一點。
複製對象句柄
這種方法是三個進程的遊戲。把A的某個內核對象拷貝到B中要C來完成。