多程序共享核心物件

2021-10-03 01:49:00 字數 3189 閱讀 6073

首先,核心物件是什麼?引用《windows核心程式設計》原文:

「每個核心物件都只是乙個記憶體塊,它由作業系統核心(ring0)分配,並只能由作業系統核心訪問。」

核心物件存在於程序虛擬位址空間的高位址(32位:0x80000000-0xffffffff),它由三個部分組成:物件頭(_object_header)、物件體(_eprocess/_ethread)和附加資訊。

(書中提到的引用計數和安全描述符存在於物件頭中)

由於核心物件只能由作業系統核心訪問,應用程式(ring3)不可直接訪問,因此,作業系統提供了一組api函式用於對核心物件的操作。核心物件被建立時,函式返回乙個控制代碼,用於標識所建立的物件,這些api函式可通過控制代碼對物件進行訪問。控制代碼值和程序是相關的(每個程序各自維護乙個控制代碼表),所以,依靠程序間通訊傳遞控制代碼值並使用,便可能會發生錯誤(在不同程序同一控制代碼值可能標識不同的核心物件)。

多程序共享核心物件有三種方式:核心物件控制代碼繼承、命名物件和複製物件控制代碼。

核心物件控制代碼繼承的關鍵在於兩個程序必須具有父子關係,即乙個程序生成另外乙個程序。子程序成功繼承並能使用繼承的核心物件需滿足兩點條件:一是父程序需設定該核心物件為可繼承物件;二是父程序需將控制代碼值通過某種程序間通訊的方式(命令列引數等)傳遞給子程序。

需要注意的是:

1.父程序控制代碼表中「可繼承控制代碼」會複製到子程序控制代碼表相應位置,也就是說它們的控制代碼值是相同的。這也是父程序和子程序共享核心物件的前提。

2.核心物件控制代碼的繼承只發生在子程序生成時,之後父程序再生成的「可繼承物件」不再繼承給子程序。

3.子程序需要通過某種方式獲得控制代碼值,否則繼承無效(無法對核心物件進行操作)。

測試**:

建立乙個可繼承的事件核心物件,在建立子程序的時候選擇繼承,並將事件物件的控制代碼值以命令列引數(ar**)傳入子程序。子程序得到控制代碼值,並呼叫setevent函式。事件授信,父程序彈框提示成功。

**關鍵點:

1.允許核心物件繼承

2.通過某種方式傳給子程序控制代碼值

//父程序**

#include

#include

void _tmain

(int argc, tchar* ar**[

], tchar* envp)

; startupinfo startupinfo =

; startupinfo.cb =

sizeof

(startupinfo)

; process_information processinfo =

;//建立安全描述符結構體,並設定控制代碼可繼承(第三引數)

security_attributes securityattributes

;//建立乙個可繼承的事件核心物件

handle eventhandle =

createevent

(&securityattributes, true, false,

null);

if(eventhandle ==

null

)else

//解除父程序對子程序資源的占有 //為何?

if(processinfo.hprocess !=

null

|| processinfo.hthread !=

null

)//等待事件授信

waitforsingleobject

(eventhandle, infinite)

;//子程序設定這個事件則授信,並彈出messagebox

messagebox

(null,_t

("子程序觸發事件,繼承成功"),

_t("success"),

1);_tprintf(_t

("input anykey to exit\r\n"))

;_gettchar()

;}exit:

if(eventhandle !=

null)}

//子程序**

#include

#include

void _tmain

(int argc, tchar* ar**[

], tchar* envp)

//停頓5s,檢視一下傳進來的控制代碼值

sleep

(5000);

if(eventhandle !=

null

)exitprocess(0

);} __except (exception_execute_handler)

}

測試**:

程序1建立命名事件物件,程序2使用相同名稱建立事件物件,並呼叫setevent函式。事件授信,程序1彈窗提示成功。

//程序1

#include

#include

void _tmain

(int argc, tchar* ar**[

], tchar* envp)

waitforsingleobject

(eventhandle, infinite)

;messagebox

(null,_t

("子程序觸發事件"),

_t("success"),

1);_tprintf(_t

("input anykey to exit."))

;_gettchar()

;exit:

if(eventhandle !=

null)}

//程序2

#include

#include

void _tmain

(int argc, tchar* ar**[

], tchar* envp)

//停頓5s,檢視一下傳進來的控制代碼值

sleep

(5000);

if(eventhandle !=

null

)exitprocess(0

);}

乙個程序初始化時會生成乙個專供核心物件使用的控制代碼表,控制代碼表本質是乙個結構體陣列。結構體(記錄項)包含指向核心物件頭(_object_header)的指標、訪問掩碼和控制代碼的屬性(繼承屬性和禁止關閉)等。

建立核心物件時程序會為其在控制代碼表中分配乙個記錄項,函式返回核心物件的控制代碼(控制代碼表索引的四倍)。

多程序檔案共享

一種方法是使用檔案鎖,利用fcntl函式對於檔案進行加鎖解鎖操作,以達到互斥訪問的目的,但是在控制時需要注意程序之間的關係,在有多個程序和共享資源時,應注意死鎖的避免。上乙個最開始寫的程式吧,簡單,就是兩個程序互斥訪問檔案。include include include include void r...

多程序共享 同步

usr bin python coding utf 8 from multiprocessing import process,array,value deff n,a n.value 3.1415926 for i in range 5 a i a i if name main num value...

多程序資料共享

不用程序池的多程序的資料共享from multiprocessing import process,queue queue queue def func a,q re f 我是子程序 我放入data q.put re if name main ls for i in range 10 p proce...